无法将 push_back() 导出 class 到 C++ 中的 STL 列表

Fail to push_back() derived class into STL list in C++

如有任何帮助,我将不胜感激。

问题是我无法成功push_back将某些东西放入STL列表中。 详情如下:

Fo 是抽象 class,Foo 是 class 继承自 Fof0f1 是 class Foo 的实例。 fooList 的类型为 std::list<Foo>foList 的类型为 std::list<Fo*>.

当我尝试 fooList.push_back(f1); 时,我可以 cout 成员 p 的值,但不能调用函数 test(); 当我尝试 foList.push_back(&f1); 时,我什至不能 cout 成员 p 的值,更不用说调用函数 test().

带有 error-1/2/3 注释的行,我得到了输出:

Fo constructor
Foo constructor
Fo constructor
Foo initialization 
Fo constructor
Foo copy constructor
inside fooList :11
------------------------

我也意识到 foList.push_back(&f1) 没有调用 Foo 复制构造函数, 这可能与错误 2 有关。

当我尝试在 fooList 中调用函数 test() 时,我得到一条错误消息:

error: member function 'test' not viable: 'this' argument has type
  'const Foo', but function is not marked const

当我尝试在 foList 中查找成员 p 时,我收到一条错误消息:

error: no member named 'p' in 'Fo'

我不知道如何解决这个问题。

非常感谢!

完整代码列表如下:

#include <iostream>
#include <list>

class Fo
{
public:
    Fo() { std::cout << "Fo constructor" << std::endl; }
    Fo(const Fo& f) { std::cout << "Fo copy constructor" << std::endl; }
    virtual ~Fo(){};
    virtual void test()=0;
};

class Foo : public Fo
{
public:
    int p;
    Foo() { std::cout << "Foo constructor" << std::endl; }
    Foo(int p_): p(p_) {std::cout << "Foo initialization " << std::endl;};
    Foo(const Foo& f) { this->p = f.p; std::cout << "Foo copy constructor" << std::endl; }
    virtual void test() {std::cout<<"testing Foo ... "<<std::endl;}
};

int main() {
    Foo f0,f1(11);

    std::list<Foo> fooList;
    std::list<Foo>::const_iterator i=fooList.begin();
    fooList.push_back(f1);i++;
    std::cout << "inside fooList :" << i->p << std::endl;
    //std::cout<<"inside fooList :"<<i->p<<" and "<<i->test();  // error-1
    std::cout << "------------------------" << std::endl;

    std::list<Fo*> foList;
    std::list<Fo*>::const_iterator it=foList.begin();
    foList.push_back(&f1);it++;
    //std::cout<<(*it)->p<<std::endl;  // error-2
    //std::cout<<"inside foList :"<<(*it)->p<<" and "<<it->test();  // error-3

    return 0;
}

修复

//std::cout<<"inside fooList :"<<i->p<<" and "<<i->test();  // error-1

改变

std::list<Foo>::const_iterator i=fooList.begin();

std::list<Foo>::iterator i=fooList.begin();

修复

//std::cout<<(*it)->p<<std::endl;  // error-2

替换为

std::cout<<(Foo*(*it))->p<<std::endl;  // error-2

修复:

//std::cout<<"inside foList :"<<(*it)->p<<" and "<<it->test();  // error-3

替换

//std::cout<<"inside foList :"<<(Foo*(*it))->p<<" and "<<it->test();  // error-3