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*当你改变它时,你会遇到从to的转换VirtualObject*可以自动完成的问题(因为任何VirtualCircle实例也总是一个VirtualObject实例),但反过来需要显式转换,因为编译器不能确定它总是安全地将 a 解释VirtualObject为 a VirtualCircle。您需要的演员表是dynamic_cast.

甚至比dynamic_cast将设计更改为使用虚拟功能更好。它们专为此类情况而设计。

于 2013-01-02T17:00:34.783 回答