2016-12-07 8 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を使用してください。導かれた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++; 
} 

また、インターフェイスの基本クラスが正しく定義されていないことにも注意してください。仮想デストラクタを用意する必要があります。そうしないと、派生クラスのデストラクタは呼び出されません。正しいバージョン:

class Base{ 
    virtual void method() = 0; 
    virtual ~Base() {}; 
} 
関連する問題