STL std::map 和 std::vector ;检查地图中的对象类型
STLs std::map and std::vector ; checking for object types in a map
所以我在我的程序中进行事实检查时遇到了问题,代码如下:
该向量包含 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++;
}
}
}
}
我不确定语法是什么或检查正确对象类型背后的逻辑。
if(iter->second[i] == (derived_1 /*"objects"*/))
没有直接的方法可以做到这一点。派生对象当作为基础对象时,无法隐式知道它的实际类型。
你可以做的是,有一个 returns 类型代码的虚方法。
virtual void getTypeCode() {
return 1; //1 for derived_1; 2 for derived_2 etc...
}
所以你可以这样做:
if(iter->second[i] == 1) { //process derived_1 }
有各种习惯用法和技巧可以使生成类型代码的工作更容易。一个常见的例子是静态成员的地址。
有很多方法可以实现您的目标。您可以将 Base
接口扩展为 return 某种对象类型标识符。另一种选择是使用 RTTI:
for(auto pObj : vector)
{
if(dynamic_cast<derived1*>(pObj))
d1_count++;
}
另请注意,您的接口基 class 定义不正确。您必须提供虚拟析构函数,否则派生的 classes 的析构函数将不会被调用。正确的版本应该是:
class Base{
virtual void method() = 0;
virtual ~Base() {};
}
所以我在我的程序中进行事实检查时遇到了问题,代码如下: 该向量包含 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++;
}
}
}
}
我不确定语法是什么或检查正确对象类型背后的逻辑。
if(iter->second[i] == (derived_1 /*"objects"*/))
没有直接的方法可以做到这一点。派生对象当作为基础对象时,无法隐式知道它的实际类型。
你可以做的是,有一个 returns 类型代码的虚方法。
virtual void getTypeCode() {
return 1; //1 for derived_1; 2 for derived_2 etc...
}
所以你可以这样做:
if(iter->second[i] == 1) { //process derived_1 }
有各种习惯用法和技巧可以使生成类型代码的工作更容易。一个常见的例子是静态成员的地址。
有很多方法可以实现您的目标。您可以将 Base
接口扩展为 return 某种对象类型标识符。另一种选择是使用 RTTI:
for(auto pObj : vector)
{
if(dynamic_cast<derived1*>(pObj))
d1_count++;
}
另请注意,您的接口基 class 定义不正确。您必须提供虚拟析构函数,否则派生的 classes 的析构函数将不会被调用。正确的版本应该是:
class Base{
virtual void method() = 0;
virtual ~Base() {};
}