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.
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. –
Oder Sie können es an Ort und Stelle konstruieren. – LogicStuff