2016-07-30 11 views
3

Wenn ich einen zweiten Konstruktor verwende, ist das Objekt immer noch NULL nach dem Aufruf. Ich bin mir ziemlich sicher, dass es nicht so funktioniert, aber wie soll ich das sonst machen? Ich habe keine Ahnung, wie die Transform Struktur in der richtigen Delegation zu machen (ich weiß, wie man einen Konstruktor delegieren, weil ich es für die Vector3D tat):So delegieren Sie einen Konstruktor korrekt

object::object(char* filename, std::string name, Transform transform) : m_pFilename(filename), m_name(name), m_transform(transform) {} 

object::object(char* filename, std::string name) 
{ 
    Transform transform = { 
     Vector3D(0.0f, 0.0f, 0.0f), 
     Vector3D(0.0f, 0.0f, 0.0f), 
     Vector3D(1.0f, 1.0f, 1.0f), 
    }; 
    object(filename, name, transform); 
} 
+0

Wie Sie sagen, ist dies kein delegierender Konstruktor, sondern ein lokales temporäres 'Objekt'. Ein Konstruktoraufruf * muss * in die Initialisierungsliste vor dem Konstruktorhauptteil gehen. Sie müssen die Transformation also woanders hin verschieben. –

+0

Oder Sie können es an Ort und Stelle konstruieren. – LogicStuff

Antwort

6

Das ist nicht, was für ein Delegieren Konstruktor ist.

Ein delegierender Konstruktor wird mit derselben Syntax aufgerufen, die zum Aufrufen von Konstruktoren der Oberklassen (mehr oder weniger) verwendet wird.

So, hier ein Delegieren Konstruktor wäre:

object::object(char* filename, std::string name) 
      : object(filename, name, /* here be dragons */) 
{ 
} 

Mit dem „/* here be dragons*/“ Teil consiting der notwendigen Voodoo, die die Instanz des Transform Objekt konstruiert. Der „hier Drachen“ Teil könnte sein (je nachdem, was Ihre Transform ist):

Transform{ 
    Vector3D(0.0f, 0.0f, 0.0f), 
    Vector3D(0.0f, 0.0f, 0.0f), 
    Vector3D(1.0f, 1.0f, 1.0f), 
} 

Das wird wahrscheinlich funktionieren. Oder es könnte sein:

Transform(
    Vector3D(0.0f, 0.0f, 0.0f), 
    Vector3D(0.0f, 0.0f, 0.0f), 
    Vector3D(1.0f, 1.0f, 1.0f), 
) 

oder in jedem Fall, kann es immer sein:

make_transform() 

Mit diesen make_transform() in irgendeiner geeigneten Stelle definiert:

Transform make_transform() 
{ 
    Transform transform = { 
     Vector3D(0.0f, 0.0f, 0.0f), 
     Vector3D(0.0f, 0.0f, 0.0f), 
     Vector3D(1.0f, 1.0f, 1.0f), 
    }; 

    return transform; 
} 

Can not verbindlich angeben welcher; hängt davon ab, was der Transform ist, aber der eine oder andere sollte funktionieren. Aber der Punkt ist, dass ein delegierender Konstruktor ist nicht angeblich einen Konstruktor aus dem Körper eines anderen Konstruktors aufrufen. Ein delegierter Konstruktor ist ein Konstruktoraufruf, der vor dem Körper des delegierenden Konstruktors aufgerufen wird, als wäre er eine Oberklasse (mehr oder weniger, wie ich bereits erwähnte).

Das Problem beim Delegieren von Konstruktoren ist, dass Sie nicht viel tun können, bevor der Konstruktor delegiert wird. Die einzige zulässige Syntax zum Delegieren von Konstruktoren ist die, die ich gezeigt habe. Dies bedeutet, dass Sie als Teil des Konstruktors keinen komplexen Code ausführen können, um die Argumente für den Aufruf des delegierenden Konstruktors zu finden. Der delegierende Aufruf muss sich im Initialisierungsabschnitt befinden. Das ist etwas einschränkend, aber es ist, was es ist. Arkane Tricks sind ziemlich üblich, einschließlich gcc 's ({ ... }) Erweiterung.

+0

Danke das hat funktioniert;) – Rafiwui

Verwandte Themen