"craig" <cr**********@comcast.netschrieb im Newsbeitrag
news:11**********************@i42g2000cwa.googlegr oups.com...
During construction of an object "parent", if you create a subobject
that stores a pointer to the parent (through the "this" pointer), will
that pointer be valid when the subobject is later called?
class Parent
{
Parent::Parent() { child = new Child( this) };
Child *child;
};
class Child
{
Child::Child( Parent *par) { myParent = par };
Parent *myParent;
}
Will myParent be the correct address when child is subsequently
accessed?
As long as your new instance of Child does only save a copy of the pointer
for later use, it is safe. If -- in Child's constructor -- it uses the
pointer to access data or non-static functions of its parent, that may
result in unexpected or even undefined behaviour.
Imagin there are other classes derived from Parent and Parent has virtual
functions. If Child's constructor calls one of these virtual functions, the
implementation provided by Parent intself will be called, never that of a
derived class. If it is a pure virtual function, you'll have a problem.
The Parent object passed to child might not be properly initialized. Any
initialization Parent's constructor does after create a new Child, will not
be visible to the Child (or to any functions of Parent, which Child might
call) until Parent's constructor has been completed. Even though all bases
and members of Parent have been constructed once exceution of a constructors
body starts, that does not always gurantee that the object is in a well
defined state.
Think about (a poorly designed) class like
class Parent
{
int x;
Child* child;
...
public:
int GetX() const { return x; }
Parent()
{
child = new Child(this);
x = 0;
}
...
};
If Child's constructor would call Parent::GetX on its input object, it would
get some random value.
HTH
Heinz