C++如何初始化成员对象
C++ How to Initialize member object?
在下面示例的第一部分中,是否有一些方法可以初始化c类型的(?)成员变量c?或者我必须使用示例第二部分中显示的new()方法吗?
类B将类A作为注入的依赖项。C类也是如此。B类由C类额外组成。
如何将注射的A注射给B的成员C?
第1部分
class A { // ...; };
class C {
public:
C(A &a) : a(a) {} // constructor
};
// Does not work as is. Want to make compiler manage C lifetime.
class B {
public:
B(A &a); // constructor
C c(a); // member variable
};
// constructor
B::B(A &a) : a(a) {
}
第2部分
// Works, but requires programmer to manage C's lifetime.
class B {
public:
B(A &a); // constructor
C *c; // member variable
};
// constructor
B::B(A &a) : a(a) {
c = new C(a);
}
下面有几个不错的答案!我为这个令人困惑的例子道歉。我对所有好的答案和问题都投了赞成票。不幸的是,我只能将一个答案标记为已接受的答案,所以我选择了第一个,它让我看到了我真正问题的解决方案,这比我在这里的蹩脚例子更复杂。
成员变量在构造函数的初始化列表中初始化(在主体之前),因此需要执行以下操作:
B::B(A &a)
: c(a) // Calls constructor C(a) on member c
{}
您几乎拥有它:
class B {
public:
B(A &a);
C c(a); //see note 1
};
B::B(A &a) : a(a) { //see note 2
}
注1:
这里C c(a);
有两个问题:
a
不在作用域中。a
只存在于构造函数的范围内,因此需要从那里初始化c
- 在C++11之前,非静态数据成员初始值设定项(NSDMI)是被禁止的。即使在C++11中,初始化NSDMI时也必须使用等号(
C c = value;
)或大括号(C c{value};
)
注2:
你几乎说对了:
B::B(A &a) : a(a)
您正在尝试初始化一个名为a
的数据成员,该成员的参数给定给构造函数。实际上,您想要像这样初始化c
,而不是不存在的a
:
B::B(A &a) : c(a)
c
的生存期将是B
类的实例的生存期。使用动态内存管理当然不是必须的。
"如何将注入的A送到B的成员C?"
您可以使用B
的构造函数成员初始值设定项列表来完成此操作
class B {
public:
B(A &a) : c(a) {
// ^^^^
}
C c; // <<< It's not possible to initialize members in their
// declaration.
};
以下内容:
C(A &a) : a(a) {}
由于CCD_ 13(初始化列表中的第一个a
)不是CCD_。
B
的构造函数也是如此。
相关文章:
- g++ 在某个类成员未初始化时不发出警告
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 对象初始化中是否允许指向此成员的指针?
- 对象初始化后在C++中显示 char 数组时的异常行为
- 为什么两种不同的对象初始化方式给出不同的输出
- 静态 constexpr 成员变量初始化
- C++内联数组成员统一初始化
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- afxmem.cpp中的对象初始化差异
- 删除通过取消引用新对象初始化的对象
- 如何使用sregex_token_iterator对象初始化向量
- 关于默认构造函数,对象初始化/使用C++ OOP
- 内联初始化的静态 const 类成员的初始化顺序保证
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- C++ 基元类型初始化与对象初始化
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 哪个函数负责C++全局范围内的类对象初始化?
- 使用从另一个类继承的类的对象初始化成员对象
- 构造函数和对象的成员变量初始化
- 静态成员对象初始化