On Apr 20, 11:21 am, Jia <JiaLi...@gmail.com> wrote:
Hi all,
I have a class foo which has a static vector of pointers of type base
class, and a static function to set this vector.
#include <iostream>
#include <vector>
using namespace std;
class super{
protected:
int a;
public:
virtual void printOut(){ cout << "super " << endl;}
};
class subA : public super{
protected:
int a_a;
public:
virtual void printOut(){ cout << "subA" << endl;}
};
class subB : public super{
protected:
int a_b;
public:
virtual void printOut(){cout << "subB" << endl;}
};
class foo {
protected:
static std::vector<super*> myList;
static std::vector<static subA> templist;
static int count;
public:
static void setMyList();
static vector<super*> getMyList();
};
std::vector<super*>foo::myList;
std::vector<subA> foo::templist;
int foo:: count = 0;
void foo::setMyList(){
subA mysubA;
templist.push_back(mysubA);
myList.push_back(&(templist[count]));
count++;
cout<< count << " time call setMyList" << endl;
}
vector<super*> foo::getMyList()
{
return myList;
}
main()
{
foo::setMyList();
foo::setMyList();
vector<super*> newList;
newList = foo::getMyList();
newList[0]->printOut();}
What I really try to achieve is to set the myList to a vector of
pointers of super type, but actually points to the derived class
objects. I use a static vector of subA to store the sub object, so
that I could use its address to initilize myList( I know this is very
ugly, but I haven't figure out other method). But my problem is that
myList is not properly set as I expected. For example, as above
program will crush as try to execute newList[0]->printOut(). I
figured out that everytime templist calls push_back, its address has
been changed ( the first time is 0x0033c10, and second time after
push_back is called, its address has been changed) so that myList
first pointer points to nowhere, but I have already defined the
templist as static. Can anyone explain this to me? I hope I explain
myself clearly.
Apparently my previous response didn't go through or has been delayed.
The fundamental problem is that templist is being resized by the
push_back, which invalidates all pointers and iterators. Try this
instead:
#include <iostream>
#include <vector>
using namespace std;
struct super
{
virtual ~super() {}
virtual void printOut()
{ cout << "super\n";}
};
struct subA : super
{
virtual void printOut()
{ cout << "subA\n"; }
};
class foo
{
vector<super*> myList;
public:
~foo()
{
for( size_t n=0; n < myList.size(); ++n )
{
delete myList[n];
}
}
void setMyList()
{
myList.push_back( new subA );
cout<< "called setMyList" << endl;
}
vector<super*> getMyList() const
{
return myList;
}
};
int main()
{
foo f;
f.setMyList();
f.setMyList();
const vector<super*> newList = f.getMyList();
for( size_t n=0; n < newList.size(); ++n )
{
newList[n]->printOut();
}
}
Cheers! --M
Thanks a lot. Your program makes much more sense than mine. Just want
to ask you a further question(sorrry if it is stupid). Does resize