Re: Passing *this in constructor
On Jun 7, 12:34 am, Frank Birbacher <bloodymir.c...@gmx.net> wrote:
James Kanze schrieb:
The answer is "yes, you can" in this simple case. If the
object expects a reference to a base class, however, you
have undefined behavior (and I've encountered cases where it
doesn't work), since conversion to base is also undefined
behavior.
Wait a second. What's that? Has the following undefined behaviour?
struct Foo {
private:
//..lots of member variables needing initialisation
string name;
Bar whatever;
protected:
void run();
};
struct Runner : Foo
{
Runner();
~Runner();
boost::thread myThread;
};
Runner::Runner()
: Foo()
, myThread(bind(&Foo::run, this))
{}
Runner::~Runner()
{
myThread.interrupt();
myThread.join();
}
That's boost::bind, right. A template. So the function will
adopt to the type of this, and no conversion will be necessary.
This is a problem with a lot of home built thread classes,
which, even worse, will offen convert the derived this to a
void* (legal, but...), only to convert the void* to Base* (and
not Derived*) in the start up routine.
Maybe this doesn't actually force the conversion of "this" to
"Foo*", but it's an example of what I currently need in some
code. I just want to know some rules about this. So when does
it become dangerous?
The problem here is elsewhere: you're starting a thread in the
constructor of the thread object, and that's a recepe for
disaster, and something you rigorously want to avoid. (What
happens if someone comes along and derives from Runner?) In
this case, I don't think it's really necessary in your design,
either: you could use containment, and not derivation here, for
example, although I don't like the fact that you then depend on
the order of initialization---it works, but it is fragile,
because the dependency isn't obvious at the place where the
order is determined; the class definition. And even better
solution might be for Runner to maintain an auto_ptr to Foo.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34