无法将 push_back() 导出 class 到 C++ 中的 STL 列表
Fail to push_back() derived class into STL list in C++
如有任何帮助,我将不胜感激。
问题是我无法成功push_back将某些东西放入STL列表中。
详情如下:
Fo
是抽象 class,Foo
是 class 继承自 Fo
。
f0
、f1
是 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
如有任何帮助,我将不胜感激。
问题是我无法成功push_back将某些东西放入STL列表中。 详情如下:
Fo
是抽象 class,Foo
是 class 继承自 Fo
。
f0
、f1
是 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