2017-07-27 2 views
0

Je suis novice en C++ et ma question est peut-être triviale, mais je n'ai pas trouvé de solution. J'ai deux classes, S et L. S ressemble à ceci:Initialisation de la classe à l'intérieur de la classe

class S 
{ 
private: 
    int m_x; 

public: 
    S(int x) : m_x(x) 
    { 
    } 

    int m_y = 2*m_x; // some random action in S 
}; 

Maintenant, j'ai une deuxième classe L, où je veux initialiser un 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. 
}; 

Cela produit une erreur error: expected identifier before numeric constant à la ligne d'initialisation de s(10).

Je ne comprends pas pourquoi je ne peux pas faire ça. Comment pourrais-je résoudre ce problème? Et si je voulais initialiser l'objet S s(m_y) à la place?

+0

Déplacer l'initialisation de '' s' dans le constructeur de L'. – DimChtz

+0

Essayez d'initialiser 's' dans le constructeur de la classe' L'. – wdc

Répondre

6

Vous pouvez utiliser member initializer list, comme vous l'avez fait pour m_y:

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

Ou utilisez default initializer list de 11 C++, mais notez qu'il est pris en charge uniquement pour croisillon ou égale à initialiseur, non compris la parenthèse un.

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

Merci beaucoup! Y a-t-il un moyen préférable à l'autre? – DominikS

+0

@DominikS Si vous voulez initialiser 's' à partir du paramètre du constructeur (comme' m_y'), ou que votre compilateur ne supporte pas C++ 11, vous devez utiliser la liste d'initialisation des membres. Autrement (c'est-à-dire initialiser 's' avec la valeur par défaut) les deux fonctionnent bien. – songyuanyao

1

Vous utilisez un compilateur >c++11 et en utilisant dans l'initialisation de la classe membre non statique démontrer avec la ligne int m_y = 2*m_x;. Pour utiliser le même mécanisme d'initialisation avec un objet constructible, vous devez utiliser la syntaxe d'initialisation uniforme, en utilisant des accolades:

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

// ignore the rest for now. 
};