2013-01-02 6 views
1

나는이타입 캐스팅 : 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 루프는 객체를 통과합니다.

은 내가 벡터를 통과하고 원을 보여주기 위해 노력하고 VirtualCircle

상속 기본 클래스 VirtualObject 있습니다. 이것은 OpenCV에 대해 수행되고 있으므로 일부 OpenCV 기능을 찾을 수 있습니다. 여기

내가 for 루프를 사용하여 통과 드릴 수 없습니다 호출 코드

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); 

입니다. 타입 캐스팅은 나에게 분명하지 않다. 제발 조언.

+1

포인터를 사용하면 개체 조각이 생깁니다. – chris

+0

당신은 벡터에 대한 포인터를 의미합니까? 벡터 ?? –

답변

4

벡터에 VirtualObject 인스턴스 (포인터 대신)를 저장하면 slicing이 발생했습니다. 즉, 귀하의 벡터 전혀 동그라미를 보유하지 않습니다 의미합니다.

당신이를 변경하면, 당신은 (어떤 VirtualCircle 인스턴스가 VirtualObject 인스턴스가 항상도 있기 때문에) VirtualObject*-VirtualCircle*에서 변환이 자동으로 수행 할 수있는 문제로 실행할 수 있지만 그 반대, 명시 적 캐스트가 필요 컴파일러 수 있기 때문에 VirtualObjectVirtualCircle으로 해석하는 것이 항상 안전한지 확인하십시오. 여기에 필요한 캐스트는 dynamic_cast입니다.

심지어 더 나은 dynamic_cast 가상 기능을 사용하도록 디자인을 변경하는 것입니다. 그들은 이런 상황을 위해 정확하게 설계되었습니다.