2010-01-18 7 views
11

J'ai deux classesComment utilisez-vous le constructeur par défaut pour un membre?

class a { 
    public: 
     a(int i); 
}; 

class b { 
    public: 
     b(); //Gives me an error here, because it tries to find constructor a::a() 
     a aInstance; 
} 

Comment puis-je obtenir pour que AINSTANCE est instancié avec un (int i) au lieu d'essayer de rechercher un constructeur par défaut? Fondamentalement, je veux contrôler l'appel d'un constructeur à partir du constructeur de b.

+0

Je réalise qu'il s'agit d'un exemple, et pas de code réel, mais juste pour le plaisir de ~~ être un pédant ~~ qualité de code, ce n'est généralement pas une bonne idée de faire des champs 'public'. Bien sûr, il y a quelques cas d'utilisation, et ce n'est pas ununiversel, mais avant de le faire, assurez-vous qu'il y a une raison au-delà de cela: cela simplifierait une partie de mon code. , cependant) –

Répondre

20

Vous devez appeler un (int) explicitement dans la liste d'initialisation du constructeur:

b() : aInstance(3) {} 

Où 3 est la valeur initiale que vous souhaitez utiliser. Bien que cela puisse être n'importe quel int. Voir les commentaires pour les notes importantes sur la commande et autres mises en garde.

+0

Merci beaucoup. Je pensais que c'était seulement pour appeler les constructeurs de classes parents. –

+1

Oui, vous pouvez également l'utiliser pour initialiser les membres. –

+0

Dans certains cas, vous devez initialiser des membres (références, par exemple), et voici comment vous le faites. –

3

Utilisez une liste d'initialisation:

b::b() : aInstance(1) {} 
0

Il suffit d'utiliser un constructeur qui est défini comme suit:

class b { 
public: 
    b() 
    : aInstance(5) 
    {} 
    a aInstance; 
}; 
+1

Ce n'est pas un C++ valide. –

+1

Avec une variable membre, cela ne fonctionnera que si la variable est une constante statique, comme dans 'static const int x (3);' –

+0

Je dois noter que je ne passe pas une constante au constructeur, mais un autre membre de b. Quand j'essaie de faire une aInstance (c); interprète cela comme une définition de fonction. –

-2

Je pense que vous devez utiliser un pointeur sur 'a' comme:

class b { 
public: 
    b() : aInstance(new a(5)) {} 
    a *aInstance; 
}; 

De cette façon, vous aurez un comportement défini. Bien sûr, vous devrez libérer * aInstance dans le destructeur.

+1

L'allocation de tas n'est pas vraiment préférée à l'allocation de pile. Votre code manque maintenant un constructeur de copie, un opérateur d'affectation et un destructeur. – GManNickG

+1

Je suis d'accord. J'étais un peu trop rapide avec mon commentaire, d'autant plus qu'Instance n'est qu'un petit objet. Je pensais à des situations de la vie réelle où les objets pourraient être plus grands, où vous pourriez avoir une initialisation paresseuse, etc. Je suppose que j'ai fait beaucoup de C# et de Java dernièrement où presque tout est fait par référence;) –

Questions connexes