J'ai une classe dérivée de la classe de base et définissez des constructeurs pour chaque classe, mais je continue à obtenir une erreur que je n'ai pas de constructeur pour la classe de base. Ici, je reçois un Erreur sur Huey () et il est indiqué "Aucun constructeur par défaut n'existe pour" chien "". Mais je pense avoir créé un constructeur pour chien de classe. Pouvez-vous s'il vous plaît expliquer pourquoi ce code est faux? P> p>
3 Réponses :
Lorsque vous spécifiez tout constructeur à vous, le constructeur par défaut n'est plus créé. Cependant, vous pouvez simplement le ajouter.
class Dog { protected: string name; int age; public: Dog(string dogsName, int dogsAge) { name = dogsName; age = dogsAge; } virtual void Bark() { cout << "Woof Woof I am a dog" << endl; } }; class Huey: public Dog { public: Huey() : Dog("goodboy", 13) {} void Bark() { cout << "woof" << endl; } };
J'ai une question ... Qu'en est-il de Dog (String Dogname, INT Dogsage) {Nom = Dogname; Âge = dogage; } code>? Ce constructeur n'est-il pas aussi? J'ai appris cela comme constructeur surchargé et je peux utiliser un constructeur surchargé lorsqu'il n'y a pas de constructeur par défaut ....
Oui c'est un constructeur. Vous pouvez instancier un objet en utilisant ce constructeur comme celui-ci: chien D ("bon garçon", 2); code>. En classe
huey code> Vous pouvez appeler
chien :: chien (chaîne, int) code> en l'appelant dans la liste d'initialistes:
Huey (): Chien ("Goodboy", 13) {} code>. Lorsque vous ne spécifiez pas le constructeur à utiliser dans la liste d'initialistes, il utilise le constructeur par défaut. C'est pourquoi vous avez reçu une erreur car le constructeur par défaut n'était pas généré.
Encore une fois, désolé je suis très nouveau chez C ++, mais alors pourquoi est-ce que je reçois une erreur de "Pas de constructeur par défaut pour la classe" et d'avoir une erreur difficile qui m'arrête d'exécuter le code? Puisque j'ai un constructeur surchargé qui remplacera le constructeur par défaut, je ne devrai-t-il obtenir aucune erreur?
C ++ n'est pas assez intelligent pour choisir chien :: chien (chaîne, int) code>. Vous devez spécifier manuellement pour l'utiliser via la liste d'initialistes. C ++ ne connaît que le constructeur par défaut
chien :: chien () code> et votre constructeur personnalisé ne correspond pas à la signature de cette fonction.
@ Mm Désolé, je ne suis pas encore habitué à cela, il y a donc une erreur de frappe ......
@BradyDean je pense avoir une meilleure compréhension maintenant. Merci! :)
Vous devez créer un constructeur sans paramètres et aucune implémentation. Comme ci-dessous:
public: Dog() = default;
Bonjour, pouvez-vous expliquer pourquoi j'ai besoin de créer un constructeur sans paramètres ni de mise en œuvre? J'ai appris qu'une fois que j'ai un constructeur surchargé, je n'ai pas besoin de constructeur par défaut. Donc, je ne comprends pas pourquoi j'ai besoin d'avoir ce code ........
Deux manières: 1) Avoir un constructeur par défaut sans paramètres. 2) Appelez le constructeur existant que vous avez dans votre chien de Huey (c'est la bonne chose dans votre cas depuis que Huey est un chien après tout). Huey appelle actuellement le constructeur par défaut de chien car ce n'est pas défini et explicitement appelé. P>