[英]How to initialize an object with known parameters that is a member of a class in 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);
}
以下是几个不错的答案! 对于令人困惑的示例,我深表歉意。 我对所有好的答案和问题都投票赞成。 不幸的是,我只能将一个答案标记为已接受的答案,因此我选择的第一个答案是“ ah-ha”,在那一刻中,我看到了实际问题的解决方案,这比此处的la脚示例更为复杂。
成员变量在构造函数的初始化列表(在主体之前)中初始化,因此您需要执行以下操作:
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
}
C c(a);
有两个问题C c(a);
这里:
a
不在范围内。 a
仅存在于构造函数的范围内,因此c
需要从那里初始化。 C c = value;
)或大括号( C c{value};
)。 您几乎完全正确:
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) {}
将不会编译,因为a
(初始化列表中的第a
)不是C
的成员变量。
同样适用于B
的构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.