C++ 无法在C+;中将_back()派生类推送到STL列表中+;
我将非常感谢您的帮助 问题是我无法成功地将某些内容推回到STL列表中。 详情如下:C++ 无法在C+;中将_back()派生类推送到STL列表中+;,c++,gcc,stl,abstract-class,C++,Gcc,Stl,Abstract Class,我将非常感谢您的帮助 问题是我无法成功地将某些内容推回到STL列表中。 详情如下: Fo是一个抽象类,Foo是从Fo继承的类。 f0,f1是类Foo的实例。 dublist具有类型std::list和foList具有类型std::list 当我尝试傻瓜时,向后推(f1)我可以cout成员p的值,但不能调用函数test(); 当我尝试开本时,向后推(&f1)I甚至不能cout成员p的值,更不用说调用函数test() 注释了错误为-1/2/3的行后,我获得了输出: Fo constructor Fo
Fo
是一个抽象类,Foo
是从Fo
继承的类。
f0
,f1
是类Foo
的实例。
dublist
具有类型std::list
和foList
具有类型std::list
当我尝试傻瓜时,向后推(f1)
我可以cout
成员p
的值,但不能调用函数test()
;
当我尝试开本时,向后推(&f1)
I甚至不能cout
成员p的值,更不用说调用函数test()
注释了错误为-1/2/3的行后,我获得了输出:
Fo constructor
Foo constructor
Fo constructor
Foo initialization
Fo constructor
Foo copy constructor
inside fooList :11
------------------------
我还意识到foolist.push_back(&f1)
没有调用Foo
copy构造函数,
这可能与错误2有关
当我试图调用dublist
中的函数test()
时,我得到一条错误消息:
error: member function 'test' not viable: 'this' argument has type
'const Foo', but function is not marked const
error: no member named 'p' in 'Fo'
当我尝试在文件夹中查找成员p时,我得到一个错误消息:
error: member function 'test' not viable: 'this' argument has type
'const Foo', but function is not marked const
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;
}
#包括
#包括
Fo类
{
公众:
Fo(){std::cout修复
//std::cout<<"inside fooList :"<<i->p<<" and "<<i->test(); // error-1
//std::cout简单的回答是,如果你在进行派生,你需要存储指针,而不是对象。一个基本对象的容器只能保存基本对象,而不是派生对象。如果你修复了一些问题,这样代码就可以编译了,那么最好的方法就是“切片”,这意味着派生对象的实例实际上已转换为基类对象,而这些转换后的基类对象就是存储在列表中的对象。这不起作用,因为对象是复制的,容器实际上只存储声明类型的对象。顺便说一句:如果要“证明”在构造函数和析构函数中使用该输出的任何东西,都会缺少一些,请查看所谓的“三定律”。我想知道这些错误消息有什么不清楚的地方。它们确切地说明了问题所在。我明白了错误-2的意思。我需要进行类型转换。但是按照您的方式,编译器仍然显示错误-1的错误消息。如果您的代码中出现更多错误,请更改test()的返回类型从两个位置的void到int,chande const_iterator到两个位置的iterator,并在error-3处将其->test()更改为(*it)->test()。现在它可以工作了。而且似乎没有必要用iterator替换const_iterator。您能告诉我为什么返回类型在这里很重要吗?谢谢。这是单独问题的主题/简短地说'
//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