2016-12-07 2 views
1

사실 내 프로그램에서 코드를 확인하는 데 문제가 있습니다. 벡터에 3 가지 유형의 파생 객체가 있습니다.이 객체에는 벡터의 각 기본 객체의 하위 합계 만 있으면됩니다. 나는 그것에 대한 적절한 구문을 찾을 수없는 것 같습니다.STL std :: map 및 std :: vector; 지도에서 객체 유형 확인

class Base{ 
virtual void method() = 0; 
} 

class derived_1 : public Base{ 
    virtual void method(); 
} 
class derived_2 : public Base{ 
    virtual void method(); 
} 
class derived_3 : public Base{ 
    virtual void method(); 
} 
class general_class{ 
private: 
    //objects of derived types have been instantiated into the vector already 
    map<string,vector<Base*>> base_map; 

    void print(){ 
     //This line prints the key and size 
     cout << iter->first << " " << iter->.size(); 

     int d1_count = 0, d2_count = 0,d3_count = 0; 

     for(iter=accounts_map.begin();iter !=accounts_map.end();iter++){ 

      //So I know that the loop iterates through the map 
      //how do I fact check to determine which object was found? 
      //The below code is incorrect 

      if(iter->second[i] == (derived_1 /*"objects"*/)){ 
       d1_count++; 
      } 
      if(iter->second[i] == (derived_2 /*"objects"*/)){ 
       d2_count++; 
      } 
      if(iter->second[i] == (derived_3 /*"objects"*/)){ 
       d3_count++; 
      } 
     } 
    } 

} 

올바른 개체 유형을 확인하기위한 구문이나 논리가 확실하지 않습니다.

+1

dynamic_cast를 사용하십시오. derived_1 * d1; d1 = dynamic_cast (iter-> second [i]); if (d1) d1_count ++; – user1438832

+1

글을 참고하세요 : 다른 루프가 필요합니다. 첫 번째 루프는'map'의 항목을 반복합니다. 'vector'의 항목들을 반복하기 위해서는 또 다른 루프가 필요합니다. –

+0

그래, 방금 벡터에 대한 또 다른 루프가 필요하다는 것을 알았다. 벡터를 통과하는 구문은 무엇입니까? –

답변

0
if(iter->second[i] == (derived_1 /*"objects"*/)) 

직접적인 방법은 없습니다. 파생 된 객체가 기본 객체로 사용될 경우 암시 적으로 실제 유형임을 알 수 없습니다.

할 수있는 것은 유형 코드를 반환하는 가상 메소드가 있습니다.

virtual void getTypeCode() { 
    return 1; //1 for derived_1; 2 for derived_2 etc... 
} 

그래서 당신은이 작업을 수행 할 수 있습니다 형태 코드를 생성하는 작업을 쉽게하기 위해 다양한 숙어 및 트릭이있다

if(iter->second[i] == 1) { //process derived_1 } 

. 일반적인 예는 정적 멤버의 주소입니다.

+0

왜 'dynamic_cast'가 작업을 수행 할 때 모든 문제를 해결해야합니까? –

4

목표를 달성하는 데는 여러 가지 방법이 있습니다. Base 인터페이스를 확장하여 개체 종류 식별자를 반환 할 수 있습니다. 또 다른 옵션은 RTTI를 사용하는 것입니다 :

for(auto pObj : vector) 
{ 
    if(dynamic_cast<derived1*>(pObj)) 
    d1_count++; 
} 

또한 인터페이스 기본 클래스가 잘못 정의되어 있습니다. 가상 소멸자를 제공해야합니다. 그렇지 않으면 파생 클래스의 소멸자가 호출되지 않습니다. 올바른 버전은 다음과 같아야합니다.

관련 문제