Re: Can constructor have this pointer?
Alex wrote:
When I saw this code:
class Example {
public:
Example() {
_event = &something;
_event->addClient(*this);
...
}
...
};
I am puzzled? I understand that member non-static functions can have "this"
pointer because they are accessed by the object.
And the constructor is a non-static member function.
When called, the object is
already constructed and "this" pointer points to valid address. However,
can constructor have "this" pointer as above code indicated? I think that
the object has not been constructed so that "this" points to invalid memory
address.
You're partially right. Before the constructor is called,
memory for the object is allocated, so a pointer to that memory
can definitly exist. And the constructor needs that pointer, in
order to initialize the memory. On the other hand, the object
is not yet fully constructed, and some things you do with the
this pointer in a constructor can get you in deep trouble. For
example, if someone derives from Example, and the addClient
function takes its parameter by value, and not by reference
(highly unlikely, IMHO), you're definitely going to get into
trouble. On the other hand, if addClient takes its parameter by
reference, and doesn't do anything that would require a fully
constructed object, there is no problem. Similarly, if there is
no inheritance, and the constructor has done enough before the
call so that the object will behave like a fully constructed
object, there is no problem. (Given the names "event" and
"client" in the above, I'd guess that the first is probably the
case here. And it's a fairly well established idiom.)
In sum, it's legal to use "this" in the constructor, but it is
the programmers responsibility to ensure that the resulting uses
all work.
--
James Kanze (Gabi Software) email: james.kanze@gmail.com
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]