2012-07-25 10 views
0

지정 :캐스트가없는 알 수없는 유형의 객체 저장 및 검색

클래스 A의 객체에는 객체 배열이 들어 있습니다.

각 개체는 IB 인터페이스를 구현해야하기 때문에 IB 인터페이스를 구현해야합니다.

이러한 개체는 클라이언트에 의해 클래스 A의 개체에 전달되며 형식 C 또는 그 자식입니다. A는이 오브젝트를 다시 클라이언트로 리턴해야합니다.

문제 :는 IB에 대해, C에 대해 아무것도 몰라해야하지만, A는 C.

C의 모든 표준 용액 ++ 안전하지 않은 캐스트없이이 거기를 반환해야합니다 <>?

+1

는 소리. C++에는'class'와는 별도의 "인터페이스"라는 개념이 없습니다. 이와 같이, IB는 클래스 여야하며, A는 단순히 IB에 (포인터 | 참조)를 반환 할 수 있습니다. C는 반드시 (분명히) IB로부터 파생되어야하지만 A는 그것을 알 필요가 없습니다. –

+0

이 대답은 당신에게 몇 가지 아이디어를 줄 수 있습니다 : http://stackoverflow.com/questions/7950711/conversion-from-subclass-to-superclass-to-subclass/7950896#7950896 – ssube

+0

당신은 * 안전하지 않은 캐스트는 "> * static_cast' 등은 안전하지 않습니다. 제대로 사용하면 안전합니다. – chris

답변

0

A 알 수 없다고 생각합니다. 무엇이든C입니다. 그러나 A이 올바른 인터페이스를 사용하는 데 충분하다는 것을 알고 있으면 C++에서 그렇게 어렵지 않습니다. IB을 가진 모든 클래스는 인터페이스를 순수 가상 함수로 정의한 단일 추상 기본 클래스에서 파생됩니다. 이는 실제로 구현에서 인터페이스를 분리하는 적절한 C++ 디자인에 해당합니다. Sutter & Alexandrescu.

그렇지 않으면 위의 정말 불가능한 경우, 당신은 A 템플릿 클래스를 만들 수 있으며, static_cast를 사용하여 (컴파일시에) 클래스 유형을 해결, void*로 배열 요소를 저장합니다.

0

템플릿을 사용하여 완벽하게 안전한 클래스를 구현할 수 있습니다.

template <typename T>class A 
{ 
    std::vector<IB*> myObj; 

public: 


    void add(IB* anObj) 
    { 
     myObj.push_back(anObj); 
    } 

    void get(int anIndex, T*& anObj) 
    { 
     T* t = dynamic_cast<T*>(myObj[anIndex]); 
     anObj = t; 
    } 
}; 

그런 다음 사용하십시오. 당신이 자바를 작성하는 너무 많은 시간을 보낸 것 같은

A<C> a; 

데모가 주어 here

관련 문제