如何正确委派构造函数

时间:2016-07-30 18:34:17

标签: c++

当我使用第二个构造函数时,调用后对象仍为struct Node* Darray; ... M->Darray = malloc(sizeof(Node) * SIZE); for (i = 0; i < SIZE; i++) { M->Darray[i].data = 0; M->Darray[i].next = NULL; } 。我很确定它不会这样工作,但我该怎么做呢?我不知道如何在正确的委托中创建NULL结构(我知道如何委托构造函数,因为我是为Transform执行的):

Vector3D

1 个答案:

答案 0 :(得分:6)

这不是委托构造函数。

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

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

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

使用“/* 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),
}

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

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

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

make_transform()

在某个方便的地方定义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;
}

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

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