Типизация между производной и базой для векторных итераций: ошибка C2664

У меня есть следующие функции

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. Типография мне не понятна. Пожалуйста, порекомендуйте.

1

Решение

Храня VirtualObject экземпляры (вместо указателей) в вашем векторе, вы вызвали нарезка происходить. Это означает, что ваш вектор делает не держите кругов вообще.

Когда вы меняете это, вы сталкиваетесь с тем, что преобразование из VirtualCircle* в VirtualObject* может быть сделано автоматически (потому что любой VirtualCircle Экземпляр также всегда VirtualObject экземпляр), но для обратного требуется явное приведение, потому что компилятор не может быть уверен, что всегда безопасно интерпретировать VirtualObject как VirtualCircle, В ролях вам нужно здесь dynamic_cast.

И даже лучше чем dynamic_cast было бы изменить свой дизайн для использования виртуальных функций. Они были разработаны именно для таких ситуаций.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector