2015-07-18 11 views
9

Ich versuche ein Objekt zu instanziieren, das keinen Standardkonstruktor hat, so dass es von allen Methoden innerhalb der Klasse referenziert werden kann. Ich habe es in meiner Header-Datei deklariert, aber der Compiler sagt, dass der Konstruktor für die Klasse, die ihn erzeugt, das Mitglied explizit initialisieren muss, und ich kann nicht herausfinden, wie das geht.Explizites Initialisieren von Element, das keinen Standardkonstruktor hat

Wirklich zu schätzen Ihre Antworten, danke im Voraus!

Die Schnipsel:

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; 
} 
+0

Sie können einen Zeiger erstellen und ihn dynamisch an der Initialisierungssite zuweisen. – vukung

+2

Wenn Sie die Initialisierung in der Initialisierungsliste tun können, ist dies die beste Option, siehe [diese Frage] (http://stackoverflow.com/questions/3704722/initializing-class-without-default-constructor). So wäre es 'MyClass :: MyClass(): myObject (60) {}' – vukung

+0

Die Initialisierungsliste funktionierte, vielen Dank !!! – Lajotas

Antwort

13

Sie sind fast da. Wenn Sie ein Objekt in C++ erstellen, wird standardmäßig der Standardkonstruktor für alle Objekte ausgeführt. Sie können die Sprache sagen, welche Konstruktor durch diese verwenden:

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

    myObject.doSomething(); 

} 

diese Weise ist es nicht versucht, den Standard-Konstruktor und Anrufe zu finden, welche Sie möchten.

4

Sie müssen das myObject Mitglied im Konstruktor Initialisierungsliste initialisieren:

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

Bevor Sie den Körper des Konstruktors alle Membervariablen eingeben müssen initialisiert werden. Wenn Sie das Element in der Konstruktorinitialisierungsliste nicht angeben, werden die Elemente standardmäßig konstruiert. Da MyOtherClass keinen Standardkonstruktor hat, gibt der Compiler auf.

zu beachten, dass diese Zeile:

MyOtherClass myObject (60); 

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

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

    myObject.doSomething(); 

} 

Initialisierung des Datenelements endet, bevor die Konstruktorfunktion body.in der Körperfunktion einfach

2

zuweisen Es gibt zwei Fehler

  1. Ihr Code MyOtherClass myObject(60); nicht initialisiert das ist Mitglied der Klasse, aber es deklariert stattdessen eine lokale Variable mit dem Namen myObject, die das Mitglied im Konstruktor verbergen wird. Um ein Memberobjekt zu initialisieren, das keinen Standardkonstruktor hat, sollten Sie stattdessen die Elementinitialisierungslisten verwenden.

  2. Sie versuchen C++ zu lernen, indem Sie mit einem Compiler experimentieren. Dies ist der schwerwiegendste Fehler, da es ein furchtbar schmerzhafter Weg sein wird.Der einzige Weg, um C++ zu lernen, ist es, one or two good books zu bekommen und sie von Anfang bis Ende zu lesen. Egal, wie schlau Sie sind, es gibt keine Möglichkeit, mit C++ richtig zu raten, und in einem gewissen Sinne ist es gefährlich, da es an einigen Stellen passiert, dass die richtige Antwort unlogisch und Konsequenz der historischen Entwicklung der Sprache ist. Egal, wie schlau Sie sind, es gibt keine Möglichkeit, Geschichte abzuleiten ... Geschichte muss studiert werden.

Verwandte Themen