C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 有什么自动化的方式实现后构造函数和析构前的虚拟方法调用?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
由于从内部构造函数和析构函数中@L_@R_674_11239@_2@虚拟方法的众所周知的问题,我通常会遇到需要在其构造函数之后@L_@R_674_11239@_2@最终安装方法的类,以及在它们之前@L_@R_674_11239@_2@的预先拆分方法析构函数,像这样: @H_61_2@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;

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

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

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

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

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

@H_61_2@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;

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

大佬总结

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。