Comment voulez-vous utiliser le constructeur par défaut pour un membre?
J'ai deux classes
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 de sorte que aInstance est instancié avec un(int i) au lieu d'essayer de rechercher un constructeur par défaut? Fondamentalement, je veux le contrôle de l'appel du constructeur de l'intérieur b du constructeur.
Je réalise que c'est un exemple, et pas de code, mais juste pour le plaisir de ~~étant un pédant~~ la qualité du code, il n'est généralement pas une bonne idée de faire des champs de
public
. Bien sûr, il existe certains cas d'utilisation, et ce n'est pas universellement mauvais, mais avant de le faire, assurez-vous que il ya une raison au-delà de "cela peut simplifier une partie de mon code" ("il ne simplifient beaucoup de mon code" est parfaitement acceptable raison, tout de même)OriginalL'auteur Jeremy Salwen | 2010-01-18
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin à appeler un(int) explicitement dans le constructeur de l'initialiseur de la liste:
Où 3 est la valeur initiale que vous souhaitez utiliser. Bien qu'il pourrait être n'importe quel type int. Voir les commentaires pour les notes importantes sur l'ordre et d'autres mises en garde.
Yep, vous pouvez également l'utiliser pour initialiser les membres.
Dans certains cas, vous devez l'initialiser les membres (références, par exemple), et c'est la façon dont vous le faites.
Gardez à l'esprit que les membres sont initialisés dans l'ordre de leur déclaration dans la classe, et non dans la liste d'initialiseur.
oui, dans gcc (mac, linus) et selon La Norme de la liste d'initialiseur doit être dans le même ordre que les membres sont déclarées. Le compilateur de Microsoft ne donne pas de suite (ou prévenir) si vous le faites dans un ordre différent, mais vous ne devriez pas compter sur ce comportement. En outre, l'utilisation de "ce" est dangereux car votre objet n'est pas encore construit. Certains compilateurs avertira si vous faites cela, d'autres ne le seront pas.
OriginalL'auteur i_am_jorf
Utiliser une liste d'initialisation:
OriginalL'auteur Jerry Coffin
Il suffit d'utiliser un constructeur qui est définie comme ceci:
Avec une variable de membre, cela ne fonctionnera que si la variable est un
static const
, comme dansstatic const int x(3);
En fait je dois souligner que je ne suis pas en passant une constante pour le constructeur, mais un autre membre de la b. Quand j'ai essayer de faire un aInstance(c); il les considère comme une définition de fonction.
et a type intégral.
Désolé, mon mauvais, a quoi je pensais... la fixation de l'exemple de l'init de la liste.
OriginalL'auteur Dmitry
Je pense que vous devriez utiliser un pointeur pour 'a' comme:
De cette façon, vous avez défini un comportement. Bien sûr, vous aurez besoin de libérer de l' *aInstance dans le destructeur.
Je suis d'accord. J'ai été un peu trop rapide à mon commentaire, surtout depuis aInstance est juste un petit objet. Je pensais à des situations de la vie réelle où les objets pourrait être plus grand, où vous pourriez avoir l'initialisation tardive, etc. Je suppose que je l'ai fait trop de C# et Java, dernièrement, où presque tout est fait par référence 😉
OriginalL'auteur Maurits Rijk