我很感激任何帮助。
问题是我无法成功将某些内容推送到STL列表中。 以下是详细信息:
Fo
是一个抽象类,Foo
是一个继承自Fo
的类。
f0
,f1
是类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;
}
答案 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