在类内部初始化类
Posted
技术标签:
【中文标题】在类内部初始化类【英文标题】:Initializing class inside class 【发布时间】:2017-07-27 16:54:52 【问题描述】:我是 C++ 新手,我的问题可能是微不足道的,但我无法找到解决方案。
我有两个班级,S
和 L
。 S
看起来像这样:
class S
private:
int m_x;
public:
S(int x) : m_x(x)
int m_y = 2*m_x; // some random action in S
;
现在我有第二类L
,我想在其中初始化一个S
-object:
class L
private:
S s(10); // 10 is just some random value
int m_y;
public:
L(int y): m_y(y)
// ignore the rest for now.
;
这会在s(10)
的初始化行产生错误error: expected identifier before numeric constant
。
我不明白为什么我不能这样做。我该如何解决这个问题?如果我想初始化对象 S s(m_y)
怎么办?
【问题讨论】:
将s
的初始化移动到L
的构造函数中。
尝试在L
类的构造函数中初始化s
。
【参考方案1】:
你可以使用member initializer list,就像你对m_y
所做的那样:
L(int y): s(10), m_y(y)
或使用 C++11 中的 default initializer list,但请注意,它仅支持大括号或等号初始化程序,不包括括号。
class L
private:
S s10; // or S s = S(10);
int m_y;
public:
L(int y): m_y(y) // s is initialized via default initializer list
// m_y is initialized via member initializer list
;
【讨论】:
非常感谢!有没有比另一种更好的方法? @DominikS 如果你想从构造函数的参数初始化s
(比如m_y
),或者你的编译器不支持C++11,你必须使用成员初始化列表。否则(即使用默认值初始化s
)都可以正常工作。【参考方案2】:
您正在使用>c++11
编译器并在类中使用非静态成员初始化,如int m_y = 2*m_x;
行所示。要对可构造对象使用相同的初始化机制,您必须使用统一的初始化语法,使用大括号:
class L
private:
S s10; // use braces
int m_y;
public:
L(int y): m_y(y)
// ignore the rest for now.
;
【讨论】:
以上是关于在类内部初始化类的主要内容,如果未能解决你的问题,请参考以下文章