c – 有什么自动化的方式实现后构造函数和析构前的虚拟方法调用?

前端之家收集整理的这篇文章主要介绍了c – 有什么自动化的方式实现后构造函数和析构前的虚拟方法调用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
由于从内部构造函数和析构函数调用虚拟方法的众所周知的问题,我通常会遇到需要在其构造函数之后调用最终安装方法的类,以及在它们之前调用的预先拆分方法析构函数,像这样:
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;

这是有效的,但它带有风险,呼叫者将在适当的时候忘记调用这些方法之一或两者.

所以问题是:在C中有什么办法可以自动调用这些方法,所以调用者不用记得去调用它们吗? (我猜,没有,但是我以为我会问,反正有一些聪明的方式来做)

解决方法

向C添加后构造函数的主要问题是没有人建立了如何处理后置后构造函数,post-post-post-constructors等.

基本理论是对象具有不变量.这个不变量是由构造函数建立的.一旦建立起来,可以调用该类的方法.通过引入需要后构造函数的设计,您将引入在构造函数运行后类不变量不会建立的情况.因此,允许来自后期构建函数的虚函数调用同样不安全,并且您立即失去了他们似乎拥有的一个明显的收益.

如你所示(可能没有你意识到),他们不需要:

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;

我们来看看为什么不需要这些方法.这两个调用可以从MyObject或其基础之一调用函数.但是,MyObject :: MyObject()也可以安全地调用这些函数. MyObject :: MyObject()返回后会发生什么,这将使obj-> Initialize()安全.所以obj-> Initialize()是错误的,或者它的调用可以被移动到MyObject :: MyObject().相反的逻辑与obj-> AboutToDelete()相反.最先导出的析构函数将首先运行,它仍然可以调用所有的虚拟函数,包括AboutToDelete().

猜你在找的C&C++相关文章