无法将push_back()派生类放入C ++中的STL列表中

时间:2016-02-08 16:38:03

标签: c++ gcc stl abstract-class

我很感激任何帮助。

问题是我无法成功将某些内容推送到STL列表中。 以下是详细信息:

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

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

对于带有错误-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有关。

当我尝试在test()中调用函数fooList时,我收到错误信息:

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

当我尝试在foList中cout成员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;
}

1 个答案:

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