У меня есть следующие функции
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. Типография мне не понятна. Пожалуйста, порекомендуйте.
Храня VirtualObject
экземпляры (вместо указателей) в вашем векторе, вы вызвали нарезка происходить. Это означает, что ваш вектор делает не держите кругов вообще.
Когда вы меняете это, вы сталкиваетесь с тем, что преобразование из VirtualCircle*
в VirtualObject*
может быть сделано автоматически (потому что любой VirtualCircle
Экземпляр также всегда VirtualObject
экземпляр), но для обратного требуется явное приведение, потому что компилятор не может быть уверен, что всегда безопасно интерпретировать VirtualObject
как VirtualCircle
, В ролях вам нужно здесь dynamic_cast
.
И даже лучше чем dynamic_cast
было бы изменить свой дизайн для использования виртуальных функций. Они были разработаны именно для таких ситуаций.
Других решений пока нет …