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

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

概述由于从内部构造函数和析构函数调用虚拟方法的众所周知的问题,我通常会遇到需要在其构造函数之后调用最终安装方法的类,以及在它们之前调用的预先拆分方法析构函数,像这样: MyObject * obj = new MyObject;obj->Initialize(); // virtual method call, required after ctor for (obj) to run prop 由于从内部构造函数和析构函数中调用虚拟方法的众所周知的问题,我通常会遇到需要在其构造函数之后调用最终安装方法的类,以及在它们之前调用的预先拆分方法析构函数,像这样:
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 properlydelete obj;

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

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

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

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

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

MyObject * obj = new MyObject;obj->Initialize();   // virtual method call,required after ctor for (obj) to run properlyobj->AboutToDelete();  // virtual method call,required before dtor for (obj) to clean up properlydelete obj;

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

总结

以上是内存溢出为你收集整理的c – 有什么自动化的方式实现后构造函数和析构前的虚拟方法调用?全部内容,希望文章能够帮你解决c – 有什么自动化的方式实现后构造函数和析构前的虚拟方法调用?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1253719.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存