【问题标题】:Typecasting between derived and base for vector iterations : C2664 error向量迭代的派生和基数之间的类型转换:C2664 错误
【发布时间】:2012-12-17 00:49:51
【问题描述】:

我有以下功能

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 循环遍历。我不清楚类型转换。请指教。

【问题讨论】:

  • 使用指针,否则你会得到对象切片。
  • 你的意思是向量的指针?矢量 ??

标签: c++ vector type-conversion base derived-class


【解决方案1】:

通过在向量中存储VirtualObject 实例(而不是指针),您已经导致slicing 发生。这意味着您的向量确实根本不包含任何圆圈

当您更改它时,您会遇到从VirtualCircle*VirtualObject* 的转换可以自动完成的问题(因为任何VirtualCircle 实例也始终是VirtualObject 实例),但反过来需要一个显式转换,因为编译器不能确定将VirtualObject 解释为VirtualCircle 总是安全的。您需要的演员表是dynamic_cast

甚至比dynamic_cast 更好的是更改您的设计以使用虚函数。它们专为此类情况而设计。

【讨论】:

    猜你喜欢
    • 2021-04-22
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2021-05-21
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多