提升访问子类方法的ptr_list

时间:2015-10-16 15:10:15

标签: c++ inheritance boost

首先,我只是在大约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;)不能被引用它是一个已删除的函数。

任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

我无法理解如何从迭代器

中获取子类

你不能,你现在的方式设置它。除了多态类(具有至少一个虚函数的类)之外,C ++没有运行时类型信息(rtti)。

你可以使getValue虚拟(只在它之前写virtual),而不需要从指向基类的指针获取指向派生类的指针。那将是惯用的解决方案。

如果您确实遇到了需要从基类型指针获取派生类型的案例(并且该类具有虚函数),您可以使用dynamic_casttypeid和{的组合{1}}弄清楚派生类型是什么。