1

私は次の機能を持っています

void DrawAndShowCircle(int windowWidth, int windowHeight,int windowType,Scalar windowBGColor, VirtualCircle circle)
    {
        cv::circle(circleImage,circle.Center,circle.Radius,circle.Color,circle.Thickness,circle.LineType);
    }

void DrawAndShowCircles(int windowWidth, int windowHeight,int windowType,Scalar windowBGColor, vector<VirtualObject> circles)
    {
        circleImage = Mat(windowHeight,windowWidth,windowType);
        circleImage.setTo(windowBGColor);

        for(vector<VirtualObject>::iterator it = circles.begin(); it != circles.end(); ++it)
        {
            DrawAndShowCircle(windowWidth,windowHeight,windowType,windowBGColor,*it);
        }
        imshow("circle",circleImage);
        cvWaitKey(0);       
    }

私が問題として抱えているのは、DrawAndShowCirclesで、forループを使用してオブジェクトをトラバースする時点で、型キャストを理解することに固執していることです。

VirtualObjectによって継承される基本クラス がありますVirtualCircle

ベクトルをトラバースして円を表示しようとしています。これはOpenCVに対して行われているため、いくつかのOpenCV関数があります。

これが呼び出しコードです

 vector<VirtualObject> circles;
   circles.push_back(VirtualCircle(Point(100,50),15,2,Scalar(255,100,100),1));
   circles.push_back(VirtualCircle(Point(100,100),25,2,Scalar(100,255,100),1));
   circles.push_back(VirtualCircle(Point(100,150),35,2,Scalar(100,100,255),1));
   DrawAndShowCircles(200,200,CV_8UC3,Scalar(255,255,255),circles);

forループを使用してトラバースできません。型キャストは私にはわかりません。お知らせ下さい。

4

1 に答える 1

4

VirtualObjectベクトルに (ポインターの代わりに) インスタンスを格納することで、スライスが発生しました。これは、ベクトルがまったく円を保持していないことを意味します。

VirtualCircle*それを変更すると、からへの変換がVirtualObject*自動的に行われるという問題が発生します (VirtualCircleインスタンスも常にインスタンスであるためVirtualObject)。 a を aVirtualObjectとして解釈しても安全VirtualCircleです。ここで必要なキャストはdynamic_cast.

dynamic_castまた、仮想関数を使用するように設計を変更するよりも優れています。これらはまさにこのような状況のために設計されました。

于 2013-01-02T17:00:34.783 に答える