在下面示例的第一部分中,是否有一些方法可以初始化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
的构造函数也是如此。