2012-10-01 3 views
1

기본 클래스의 객체 벡터가 있지만이 클래스를 사용하여 여러 파생 클래스가 포함되어 있다고 가정합니다. 그 벡터의 멤버가 특정 클래스인지 아닌지 확인하고 싶습니다. 어떻게해야합니까? 나는 기본 클래스의 매개 변수를 취하는 파생 클래스의 템플릿을 만드는 방법을 생각할 수 있지만 클래스를 개체와 어떻게 비교할 수 있는지 잘 모르겠습니다.C++에서 객체의 클래스를 확인하려면 어떻게해야합니까?

+0

시작하는 가능한 장소 : http://stackoverflow.com/questions/351845/finding-the-type-of-an-object-in-c – MikeB

+5

기본 클래스의 객체 벡터가있는 경우 파생 유형의 객체가 없습니다. 그들은 벡터에 저장 될 때 얇게 썬 것입니다. –

+1

진짜 질문은 왜 유형을 알아야하는지입니다. 종종 디자인상의 결함입니다. –

답변

0

당신은 dynamic_cast

을 사용할 수 있습니다하지만 당신은 그렇게 할 필요가 있다면, 당신은 아마도 디자인 문제가 있습니다. 이 문제를 해결하려면 다형성이나 템플릿을 사용해야합니다.

2

기본 클래스에 가상 멤버가있는 경우 (즉,이 유형과 같은 경우에 다형성을 가짐) down cast 각 유형 (예 : dynamic_cast 사용)을 찾으려고 할 수 있습니다.

그렇지 않으면 RTTI (즉 typeid)을 사용할 수 있습니다. 이 예 아웃

0

체크 : 여기

#include <iostream> 
using namespace std; 

#include <typeinfo> 

class A 
{ 
public: 
    virtual ~A() 
    { 
    } 
}; 

class B : public A 
{ 
public: 
    virtual ~B() 
    { 
    } 
}; 

void main() 
{ 
    A *a = new A(); 
    B *b = new B(); 

    if (typeid(a) == typeid(b)) 
    { 
     cout << "a type equals to b type\n"; 
    } 
    else 
    { 
     cout << "a type is not equals to b type\n"; 
    } 

    if (dynamic_cast<A *>(b) != NULL) 
    { 
     cout << "b is instance of A\n"; 
    } 
    else 
    { 
     cout << "b is not instance of A\n"; 
    } 

    if (dynamic_cast<B *>(a) != NULL) 
    { 
     cout << "a is instance of B\n"; 
    } 
    else 
    { 
     cout << "a is not instance of B\n"; 
    } 

    a = new B(); 

    if (typeid(a) == typeid(b)) 
    { 
     cout << "a type equals to b type\n"; 
    } 
    else 
    { 
     cout << "a type is not equals to b type\n"; 
    } 

    if (dynamic_cast<B *>(a) != NULL) 
    { 
     cout << "a is instance of B\n"; 
    } 
    else 
    { 
     cout << "a is not instance of B\n"; 
    } 
} 
관련 문제