首先,我只是在大约20年左右的时间里回到c ++。我正在努力找出一些东西。我想创建一个类层次结构,并将基类的子类实例化到列表中,并在列表上进行迭代,然后在迭代器中获取子类,或者找到实现此目的的方法。
namespace FooBar {
class ace {
public: ace::ace(){};
public: virtual int ace::getValue(){ return 1; };
};
class base : public ace {
public: base::base(){};
**// Added method for casting
public: base::base(ace){};**
public: int base::getValue(){ return 2; };
};
class face : public ace {
public: face::face(){};
**// Added method for casting
public: face::face(ace){};**
public: int face::getValue(){ return 3; };
};
}
我创建要在列表中插入的相应子类的实例。我无法理解如何从迭代器中获取子类。我已经尝试添加一个标识符,所以我会知道它是哪个类,但我无法弄清楚如何转换迭代器。
int main() {
using namespace FooBar;
boost::ptr_list<ace> theList;
for (int i = 0; i < 10; i++){
ace* foo;
if (i % 2 == 0)
foo = new base();
else
foo = new face();
theList.push_back(foo);
}
for (boost::ptr_list<ace>::iterator iter = theList.begin(); iter != theList.end(); iter++){
std::cout << (*iter).getValue() << ", ";
// cast to sub class; Is it of type base
if (typeid(base) == typeid(*iter)){
base bar = static_cast<base>(*iter);
}
else {typeid(face) == typeid(*iter)){
face bar = static_cast<face>(*iter);
}
}
}
输出为1,1,......
上述两个演员都失败,没有合适的用户定义的从ace到base / face的转换;
所以,我为base和face创建了一个构造函数,如添加的注释所示; 我现在得到的错误是
ace :: ace(const ace&amp;)不能被引用它是一个已删除的函数。
任何指导都将不胜感激。
答案 0 :(得分:1)
我无法理解如何从迭代器
中获取子类
你不能,你现在的方式设置它。除了多态类(具有至少一个虚函数的类)之外,C ++没有运行时类型信息(rtti)。
你可以使getValue
虚拟(只在它之前写virtual
),而不需要从指向基类的指针获取指向派生类的指针。那将是惯用的解决方案。
如果您确实遇到了需要从基类型指针获取派生类型的案例(并且该类具有虚函数),您可以使用dynamic_cast
或typeid
和{的组合{1}}弄清楚派生类型是什么。