Вопрос: Как правильно делегировать конструктор


Когда я использую второй конструктор, объект все еще NULL после вызова. Я уверен, что так не получается, но как же мне это сделать? Я не знаю, как сделать Transform struct в правильной делегировании (я знаю, как делегировать конструктор, потому что я сделал это для 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);
}

3


источник


Ответы:


Это не то, что конструктор делегирования.

Конструктор делегирования вызывается с использованием того же синтаксиса, который используется для вызова конструкторов суперклассов (больше или меньше).

Итак, конструктор делегирования здесь будет:

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«s ({ ... }) расширение.


6