2017-07-27 112 views
0

我是C++新手,我的问题可能很简单,但我无法找到解决方案。初始化类内的类

我有两个班,SLS看起来是这样的:

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)而不是?

+0

移动s'的'初始化成'L'的构造。 – DimChtz

+0

尝试在类“L”的构造函数中初始化's'。 – wdc

回答

6

你可以使用member initializer list,因为你为m_y

L(int y): s(10), m_y(y) 
{ 
} 

,或是使用C++ 11 default initializer list,但要注意它仅支持支柱或等于初始值,不包括括号之一。

class L 
{ 
private: 
    S s{10}; // 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 
    { 
    } 
}; 
+0

非常感谢!有一种方法比另一种更可取吗? – DominikS

+0

@DominikS如果您想从构造函数的参数(如'm_y')初始化's',或者您的编译器不支持C++ 11,则必须使用成员初始值设定项列表。否则(即用默认值初始化's')都可以正常工作。 – songyuanyao

1

您使用的是>c++11编译器和使用类非静态成员初始化为与线int m_y = 2*m_x;证明。要与施工的对象使用相同的初始化机制,你必须使用统一初始化语法,使用括号:

class L 
{ 
private: 
    S s{10}; // use braces 
    int m_y; 
public: 
    L(int y): m_y(y) 
    { 
    } 

// ignore the rest for now. 
};