STLs std :: map和std :: vector;检查地图中的对象类型

时间:2016-12-07 06:18:24

标签: c++ vector stl stdmap

所以我在我的程序中检查事实时遇到了问题: 向量包含3种类型的派生对象,我只想要向量中每个基础对象的子总数。我似乎无法找到适当的语法。

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++;
            }
        }
    }

}

我不确定语法是什么或检查正确对象类型的逻辑。

2 个答案:

答案 0 :(得分:5)

有很多方法可以实现您的目标。您可以扩展Base接口以返回一些对象类型标识符。另一种选择是使用RTTI:

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

另请注意,您的接口基类定义不正确。您必须提供虚拟析构函数,否则将不会调用派生类的析构函数。正确的版本应该是:

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

答案 1 :(得分: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 }

有各种各样的习惯用语和技巧可以让工作更容易生成类型代码。一个常见的例子是静态成员的地址。