2012-04-22 3 views
0

OGRE를 사용하고 있으며 ORIG에별로 관련이없는 문제를 겪었지만 지금 다루는 genreal C++ 문제입니다. ORGE는 질문의 맥락에 도움이됩니다.객체 유형 만 검색하기

내가 두 번째 매개 변수로 클래스의 형태로 전달해야 호출 할 삭제 위해서는

그러나
OGRE_DELETE_T(obj, ExternalClass); 

같은 뭔가,하는 매크로가있다. 그러나, 나는 그냥 A 포인터의 std::vector를 저장한다면 나는 등 기본 class A 다음 class B, class C, class D을 가지고 예를 들어 말하지만, 실제로 나는 B, C, 또는 A의 일부 deriviative로 인스턴스화 수도 , 어떻게하면이 매크로에 구성된 실제 클래스의 유형을 전달할 수 있을까요? 파생 된 개체가 내가 그것을 삭제할 때 어떤 형식인지 알지 못한다. 내가 알고있는 것은 모두 class A 포인터이다.

나는 아마도 dynamic_cast을 사용한다고 생각했지만 런타임 성능이 좋지 않았으며 검사 할 일종의 조회 테이블이 필요할 것입니다.

답변

2

파생 된 개체의 형식을 매크로에 전달하기 만하면됩니다. 베이스에 virtual 소멸자가 있으면 포인터를 제대로 삭제합니다.

+0

미안, 내가 좀 더 구체적인 있었어야 나는 가정하고있다. 파생 된 객체의 유형이 무엇인지 알지 못합니다. 내가 아는 것은 그것이'클래스 A '이고,'B','C'인지 모릅니다. – jack

0

나는이 질문이 오래된 것을 알고 있지만,이 대답은 다른 사람들에게 도움이 될 수 있습니다.

이 매크로는 메모리를 추적하는 데 사용되며 파생 된 유형에서 사용해야하는 경우 인터페이스를 약간 손상시켜야합니다. 당신이 할 수있는 한 가지 방법은 객체를 적절하게 삭제하는 가상 함수를 만드는 것입니다. OGRE_ALLOC_T 또는 OGRE_NEW_T를 사용할 때 특정 파괴 매크로를 호출해야하므로 사용자는이 특별한 경우를 인식 할 수 있습니다. 당신이이 방법을 삭제할 수 있습니다

class Parent 
{ 
public: 
    virtual void deleteSelf() = 0; 
}; 

class A : public Parent 
{ 
public: 
    virtual void deleteSelf() 
    { 
     A* p = this; 
     OGRE_DELETE_T(p, A); 
    } 
}; 

이 방법 :

Parent* p = OGRE_NEW_T(A); 
p->deleteSelf();