webentwicklung-frage-antwort-db.com.de

Initialisieren Sie explizit ein Member, das keinen Standardkonstruktor hat

Ich versuche, ein Objekt zu instanziieren, das über keinen Standardkonstruktor verfügt, sodass von allen Methoden innerhalb der Klasse darauf referenziert werden kann. Ich habe es in meiner Header-Datei deklariert, aber der Compiler sagt, dass der Konstruktor für die Klasse, die sie erstellt, das Member explizit initialisieren muss, und ich kann nicht herausfinden, wie das geht.

Vielen Dank für Ihre Antworten, im Voraus!

Der Ausschnitt:

MyClass.h

include "MyOtherClass.h"

class myClass {

    private:
        MyOtherClass myObject;

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

}

Meine Klasse.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

Du bist fast am Ziel. Wenn Sie ein Objekt in C++ erstellen, wird standardmäßig der Standardkonstruktor für alle Objekte ausgeführt. Sie können der Sprache entnehmen, welcher Konstruktor verwendet werden soll:

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

   myObject.doSomething();

}

Auf diese Weise wird nicht versucht, den Standardkonstruktor zu finden und den gewünschten Konstruktor aufzurufen.

20
Russell Greene

Sie müssen den Member myObject in der Konstruktorinitialisierungsliste initialisieren:

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

Bevor Sie den Rumpf des Konstruktors eingeben, müssen alle Elementvariablen initialisiert werden. Wenn Sie das Mitglied nicht in der Konstruktorinitialisierungsliste angeben, werden die Elemente standardmäßig erstellt. Da MyOtherClass keinen Standardkonstruktor hat, gibt der Compiler auf.

Beachten Sie, dass diese Zeile:

MyOtherClass myObject (60);

in Ihrem Konstruktor erstellt tatsächlich eine lokale Variable, die Ihre Membervariable myObject spiegelt. Das ist wahrscheinlich nicht das, was Sie beabsichtigt haben. Bei einigen Compilern können Sie Warnungen dafür aktivieren.

9
Chris Drew

Es gibt zwei Fehler

  1. Ihr Code MyOtherClass myObject(60); initialisiert nicht den Member der Klasse, sondern deklariert stattdessen eine lokale Variable namens myObject, die den Member im Konstruktor verdeckt. Um ein Member-Objekt ohne Standardkonstruktor zu initialisieren, sollten Sie stattdessen Member-Initialisierungslisten verwenden.

  2. Sie versuchen, C++ zu lernen, indem Sie mit einem Compiler experimentieren. Dies ist der schwerwiegendste Fehler, da dies ein äußerst schmerzhafter Weg sein wird. Die einzige Möglichkeit, C++ zu lernen, besteht darin, ein oder zwei gute Bücher zu erhalten und sie von Kopf bis Ende zu lesen. Egal wie viel Sie schlau sind, es gibt keine Möglichkeit, mit C++ richtig zu erraten, und in gewissem Sinne ist Schlausein gefährlich, da es an manchen Stellen der Fall ist, dass die richtige Antwort unlogisch ist und eine Folge der historischen Entwicklung der Sprache ist. Egal wie schlau Sie sind, es gibt keine Möglichkeit, die Geschichte abzuleiten. Geschichte muss studiert werden.

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

   myObject.doSomething();

}

Die Initialisierung des Datenelements endet vor dem Konstruktorfunktionskörper in dem soeben zugewiesenen Funktionshauptteil

0
kiviak