web-dev-qa-db-fra.com

Initialiser explicitement le membre qui n'a pas de constructeur par défaut

J'essaie d'instancier un objet qui n'a pas de constructeur par défaut afin qu'il puisse être référencé à partir de n'importe quelle méthode de la classe. Je l'ai déclaré dans mon fichier d'en-tête, mais le compilateur indique que le constructeur de la classe qui l'a créée doit explicitement initialiser le membre, et je ne vois pas comment le faire.

Apprécions vraiment vos réponses, merci d'avance!

L'extrait:

MyClass.h

include "MyOtherClass.h"

class myClass {

    private:
        MyOtherClass myObject;

    public:
        MyClass();
        ~MyClass();
        void myMethod();

}

MyClass.cpp

include "MyClass.h"

MyClass::MyClass() {

   MyOtherClass myObject (60);
   myObject.doSomething();

}

MyClass::myMethod() {

    myObject.doSomething();

}

MyOtherClass.h

class MyOtherClass {

   private:
      int aNumber;

   public:
      MyOtherClass (int someNumber);
      ~MyOtherClass();
      void doSomething();
}

MyOtherClass.cpp

include "MyOtherClass.h"

MyOtherClass::MyOtherClass (int someNumber) {
   aNumber = someNumber;
}

void MyOtherClass::doSomething () {
    std::cout << aNumber;
}
16
Tomaz Fernandes

Tu es presque là. Lorsque vous créez un objet en c ++, il exécute par défaut le constructeur par défaut sur tous ses objets. Vous pouvez dire au langage quel constructeur utiliser par ceci:

MyClass::MyClass() : myObject(60){

   myObject.doSomething();

}

De cette façon, il n'essaie pas de trouver le constructeur par défaut ni d'appeler celui que vous voulez.

20
Russell Greene

Vous devez initialiser le membre myObject dans la liste d'initialisation du constructeur:

MyClass::MyClass() : myObject(60) {
   myObject.doSomething();
}

Avant de saisir le corps du constructeur, toutes les variables membres doivent être initialisées. Si vous ne spécifiez pas le membre dans la liste d'initialisation du constructeur, les membres seront construits par défaut. Comme MyOtherClass n'a pas de constructeur par défaut, le compilateur abandonne.

Notez que cette ligne:

MyOtherClass myObject (60);

votre constructeur crée en fait une variable locale qui masque votre variable membre myObject. Ce n'est probablement pas ce que vous vouliez. Certains compilateurs vous permettent d'activer des avertissements pour cela.

9
Chris Drew

Il y a deux erreurs

  1. Votre code MyOtherClass myObject(60); n'initialise pas le membre de la classe, mais déclare plutôt une variable locale nommée myObject qui masquera le membre à l'intérieur du constructeur. Pour initialiser un objet membre qui n'a pas de constructeur par défaut, utilisez plutôt des listes d'initialisation de membres.

  2. Vous essayez d'apprendre le C++ en expérimentant avec un compilateur. C'est l'erreur la plus grave, car le chemin sera terriblement pénible. La seule façon d'apprendre le C++ est d'obtenir un ou deux bons livres et de les lire de bout en bout. Quel que soit votre degré d'intelligence, il est impossible de deviner correctement avec C++, et dans un sens, il est dangereux de penser que la bonne réponse est illogique et résulte de l'évolution historique du langage. Aussi intelligent que vous soyez, il n’ya aucun moyen de déduire l’histoire… L’histoire doit être étudiée.

2
6502
MyClass::MyClass(): myObject (60){

   myObject.doSomething();

}

L'initialisation du membre de données se termine avant la fonction constructeur body.in de la fonction que vous venez d'attribuer

0
kiviak