Initialiser les parents des membres protégés avec liste d'initialisation (C++)
Est-il possible d'utiliser la liste d'initialisation d'un enfant de la classe de constructeur pour initialiser les données membres déclarée protégée dans la classe parent? Je ne peux pas le faire fonctionner. Je peux le contourner, mais il serait agréable si je n'avais pas à.
Un exemple de code:
class Parent
{
protected:
std::string something;
};
class Child : public Parent
{
private:
Child() : something("Hello, World!")
{
}
};
Quand j'ai essayer cela, le compilateur me dit: "classe" Enfant " n'a pas de champ nommé 'quelque chose'". Est quelque chose comme cela possible? Si oui, quelle est la syntaxe?
Merci beaucoup!
Vous devez vous connecter pour publier un commentaire.
Il n'est pas possible dans la façon dont vous décrivez. Vous aurez à ajouter un constructeur (qui peut être protégé) à la classe de base pour l'envoyer. Quelque chose comme:
Lorsque le compilateur s'agit dans l'ensemble de la liste d'initialiseur, l'objet de classe dérivée est pas encore formé. Le constructeur de classe de base n'a pas été appelé jusqu'alors. Seulement après que le constructeur de classe de base a été appelé,
something
vient à l'être. D'où le problème. Lorsque vous ne pas appeler le constructeur de classe de base de manière explicite, le compilateur le fait pour vous (par la génération de la approprié trivial constructeur de la classe de base). Cela provoque lasomething
membre à défaut d'initialisation.À partir de C++0x projet:
Vous ne peut pas initialiser les membres de la classe parent dans le constructeur de classe dérivée de l'initialisation de la liste. Il n'importe pas s'ils sont protégés, public ou quoi que ce soit d'autre.
Dans votre exemple, membre
something
est membre deParent
classe, ce qui signifie qu'il ne peut être initialisé dans le constructeur de l'initialiseur liste deParent
classe.Peut-être vous pouvez essayer de cette façon, en utilisant le mot-clé "aide"