2016-12-07 67 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() {}; 
} 
相关问题