2016-12-07 63 views
1

所以我在我的程序中檢查事實時遇到問題繼承人代碼: 該向量包含3種類型的派生對象我只是想要向量中的每個基礎對象的子項。我似乎無法找到適當的語法。STLs 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

有很多方法可以實現您的目標。你可以擴展你的接口來返回一些對象類型標識符。另一種選擇是使用RTTI:

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

另請注意,您的接口基類的定義不正確。你必須提供虛擬析構函數,否則派生類的析構函數將不會被調用。正確的版本應該是:

class Base{ 
    virtual void method() = 0; 
    virtual ~Base() {}; 
} 
相關問題