如何正确委派构造函数

Raf*_*wui 3 c++

当我使用第二个构造函数时,对象仍在NULL调用之后.我很确定它不会这样工作,但我该怎么做呢?我不知道如何Transform在正确的委托中创建结构(我知道如何委托构造函数,因为我为它做了Vector3D):

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);
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*hik 6

那不是委托构造函数.

使用与调用超类的构造函数(更多或更少)相同的语法来调用委托构造函数.

所以,这里的委托构造函数将是:

object::object(char* filename, std::string name)
           : object(filename, name, /* here be dragons */)
{
}
Run Code Online (Sandbox Code Playgroud)

用" /* here be dragons*/"部分构成必要的伏都教,构造你的Transform对象的实例."这里是龙"部分可能是(取决于你Transform是什么):

Transform{
    Vector3D(0.0f, 0.0f, 0.0f),
    Vector3D(0.0f, 0.0f, 0.0f),
    Vector3D(1.0f, 1.0f, 1.0f),
}
Run Code Online (Sandbox Code Playgroud)

那可能会奏效.或者,它可能是:

Transform(
    Vector3D(0.0f, 0.0f, 0.0f),
    Vector3D(0.0f, 0.0f, 0.0f),
    Vector3D(1.0f, 1.0f, 1.0f),
)
Run Code Online (Sandbox Code Playgroud)

或者,无论如何,它总是可以:

make_transform()
Run Code Online (Sandbox Code Playgroud)

有了这个make_transform()在一些方便的地方定义:

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;
}
Run Code Online (Sandbox Code Playgroud)

不能权威地说明哪一个; 取决于它是什么Transform,但一个或另一个应该工作.但关键是委托构造函数应该从另一个构造函数的主体调用一个构造函数.委托构造函数是一个构造函数调用,它在委托构造函数的主体之前被调用,就好像它是一个超类(或多或少,正如我所提到的).

委托构造函数的事情是在构造函数被委托之前你不能真正做很多事情.委托构造函数的唯一允许语法是我展示的语法.这意味着您不能执行复杂的代码,作为构造函数体的一部分,以便为委托构造函数的调用提供参数.委派调用必须在初始化程序部分.这有点限制,但它就是这样.奥术权谋是相当普遍的,包括使用gcc({ ... })扩展.