Due to the well-known issues with calling virtual methods from inside constructors and destructors, I commonly end up with classes that need a final-setup method to be called just after their constructor, and a pre-teardown method to be called just before their destructor, like this:
MyObject * obj = new MyObject;
obj->Initialize(); // virtual method call, required after ctor for (obj) to run properly
[...]
obj->AboutToDelete(); // virtual method call, required before dtor for (obj) to clean up properly
delete obj;
This works, but it carries with it the risk that the caller will forget to call either or both of those methods at the appropriate times.
So the question is: Is there any way in C++ to get those methods to be called automatically, so the caller doesn't have to remember to do call them? (I'm guessing there isn't, but I thought I'd ask anyway just in case there is some clever way to do it)
I used a very carefully designed
Create()
factory method (static member of each class) to call a constructor and initializer pair in the same order as C# initializes types. It returned ashared_ptr
to an instance of the type, guaranteeing a heap allocation. It proved reliable and consistent over time.The trick: I generated my C++ class declarations from XML...
http://www.research.att.com/~bs/wrapper.pdf This paper from Stroustrup will solve your problem.
I tested this under VS 2008 and on UBUNTU against g++ compiler. It worked fine.
Haven't seen the answer yet, but base classes are only one way to add code in a class hierarchy. You can also create classes designed to be added to the other side of the hierarchy:
You can use static function template in the class. With private ctor/dtor. Run on vs2015 community
The best I can think of is for you to implement your own smart pointer with a static Create method that news up an instance and calls Initialize, and in its destructor calls AboutToDelete and then delete.
The main problem with adding post-constructors to C++ is that nobody has yet established how to deal with post-post-constructors, post-post-post-constructors, etc.
The underlying theory is that objects have invariants. This invariant is established by the constructor. Once it has been established, methods of that class can be called. With the introduction of designs that would require post-constructors, you are introducing situations in which class invariants do not become established once the constructor has run. Therefore, it would be equally unsafe to allow calls to virtual functions from post-constructors, and you immediately lose the one apparent benefit they seemed to have.
As your example shows (probably without you realizing), they're not needed:
Let's show why these methods are not needed. These two calls can invoke virtual functions from
MyObject
or one of its bases. However,MyObject::MyObject()
can safely call those functions too. There is nothing that happens afterMyObject::MyObject()
returns which would makeobj->Initialize()
safe. So eitherobj->Initialize()
is wrong or its call can be moved toMyObject::MyObject()
. The same logic applies in reverse toobj->AboutToDelete()
. The most derived destructor will run first and it can still call all virtual functions, includingAboutToDelete()
.