gcc - Fail to push_back() derived class into STL list in C++ -
i appreciate this.
the problem can not push_back stl list. here details:
fo
abstract class , foo
class inherit fo
. f0
, f1
instances of class foo
. foolist
has type std::list<foo>
, folist
has type std::list<fo*>
.
when try foolist.push_back(f1);
can cout
value member p
, can not call function test()
; when try folist.push_back(&f1);
can not cout
value member p, let alone call function test()
.
with lines error-1/2/3 commented, obtained output:
fo constructor foo constructor fo constructor foo initialization fo constructor foo copy constructor inside foolist :11 ------------------------
i realize folist.push_back(&f1)
did not call foo
copy constructor, may relevant error-2.
when try call function test()
in foolist
, obtain error msg:
error: member function 'test' not viable: 'this' argument has type 'const foo', function not marked const
when try cout member p in folist
, obtain error msg:
error: no member named 'p' in 'fo'
i have no idea how fix problem.
thanks lot!
full code list below:
#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<<" , "<<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<<" , "<<it->test(); // error-3 return 0; }
to fix
//std::cout<<"inside foolist :"<<i->p<<" , "<<i->test(); // error-1
change
std::list<foo>::const_iterator i=foolist.begin();
to
std::list<foo>::iterator i=foolist.begin();
to fix
//std::cout<<(*it)->p<<std::endl; // error-2
replace with
std::cout<<(foo*(*it))->p<<std::endl; // error-2
to fix:
//std::cout<<"inside folist :"<<(*it)->p<<" , "<<it->test(); // error-3
replace
//std::cout<<"inside folist :"<<(foo*(*it))->p<<" , "<<it->test(); // error-3
Comments
Post a Comment