c – 如何防止使用尚未构建的类成员?
发布时间:2020-12-16 07:33:04 所属栏目:百科 来源:网络整理
导读:我有以下课程: class A{public: A() { x = 0; std::cout"A default ctor()n"; } A(int x_) { x = x_; std::cout"A normal ctor()n"; } int x;};class B{public: B() { std::cout"B ctor()n"; }private:std::string str;}; 以及创建对象B的函数,将对象A作
我有以下课程:
class A { public: A() { x = 0; std::cout<<"A default ctor()n"; } A(int x_) { x = x_; std::cout<<"A normal ctor()n"; } int x; }; class B { public: B() { std::cout<<"B ctor()n"; } private: std::string str; }; 以及创建对象B的函数,将对象A作为参数: B createB(const A& a) { std::cout<<"a int: "<<a.x<<"n"; return B(); } 如果我设计一个类C,它具有类型A和B的成员并在构造A-object之前构造B对象但使用A对象这样做,这将编译而没有警告但它将默默地输入错误: class C { public: C(): b(createB(a)),a(10) {} private: B b; A a; }; int main() { C c; return 0; } 当然,上面的例子是一个微不足道的例子,但我在现实世界中看到它,在更复杂的代码中(它是星期五,晚上8:30,我刚刚解决了这个导致段错误的错误). 我怎样才能防止这种情况发生? 解决方法
我同意其他人的建议,即设计师有责任确保在使用前初始化对象.在你的情况下,我看到两种方法:
首先(也是最简单的),颠倒类定义中a和b的顺序: class C { public: C(): b(createB(a)),a(10) {} private: A a; B b; }; 其次,如果你想真正强调它的初始化发生在其他成员之前,你可以将a移动到基类: class CBase { protected: CBase(): a(10) {} protected: A a; }; class C : private CBase { public: C(): b(createB(a)) {} private: B b; }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – 使用maxchar的Center和Split字符串
- vue实现全选、反选功能
- flex的一些函数随机数random(),round(),ceil(),floor()
- Oracle Goldengate在HP平台裸设备文件系统OGG-01028处理
- ajax处理过程,ajax入门,XMLHttpRequest对象
- [Swift]自定义数据结构:优先队列PriorityQueue
- Flex对于Xml文件的增删改查类
- C# 使用 GDI+ 实现添加中心旋转(任意角度)的文字
- ruby-on-rails – Rails 3 – 使用OmniAuth设计 – 登录后重
- logback logback.xml常用配置详解(一)<configuration> a