Нужно ли иметь статические конструкторы, когда мы следуем способу RAII делать что-то на C++?

Если бы я следовал правилу RAII и разрабатывал класс на C++, были бы нужны статические конструкторы? Помогут ли мне статические конструкторы каким-либо образом или это будет неправильный шаг?


person Community    schedule 05.11.2010    source источник
comment
Существуют ли статические конструкторы в C++?   -  person Vlad    schedule 05.11.2010
comment
в С++ нет такой вещи, как статический конструктор. О чем ты говоришь?   -  person Donotalo    schedule 05.11.2010
comment
Под статическим конструктором вы имеете в виду, что настоящий конструктор является закрытым, а статические функции создают объекты?   -  person Viktor Sehr    schedule 05.11.2010


Ответы (3)


Я так понимаю, вы говорите о статической фабричной функции, которая создает экземпляр вашего класса (как указывали другие). В этом случае вам не нужно использовать шаблон RAII.

Помните, что вам нужно, чтобы ваш класс был выделен в стеке, чтобы конструктор вызывался (автоматически) и инициализировал различные данные. кроме того, деструктор вызывается (автоматически), когда стек раскручивается и выполняет другие операции: например, освобождение ресурсов и т. д.

Если ваш класс инициализирует свои данные статически, то шаблон RAII завершится ошибкой, поскольку статически хранимые данные не привязаны к экземпляру класса. Таким образом, когда стек раскручивается, нет экземпляра для уничтожения, деструктор не вызывается, и шаблон RAII не реализуется.

person C Johnson    schedule 05.11.2010

Это не имеет никакого смысла, у вас не может быть статического конструктора. Вся цель конструктора состоит в том, чтобы инициализировать конкретный экземпляр класса; если бы он был статическим, он не принадлежал бы ни одному экземпляру.

RAII просто говорит, что вам нужно освободить ресурс в деструкторе, и что получение этого ресурса происходит с инициализацией (конструкцией) объекта, который будет запускать этот деструктор. (Что влечет за собой необходимость работающего или запрещенного конструктора копирования , а также рабочий оператор присваивания.)

person GManNickG    schedule 05.11.2010

У вас может быть некоторая статическая функция CreateInstance(), которая вернет вам экземпляр вашего класса.

С RAII ваша функция, вероятно, должна будет вернуть вам некоторый интеллектуальный указатель на экземпляр, который вы создали, чтобы избежать копирования фактического объекта. Затем вы сохраняете этот указатель, копируете его, если он вам нужен, в другие места. Когда все умные указатели будут уничтожены, объект тоже будет уничтожен. Если это то, что вы хотите, то да - у вас может быть "статический конструктор".

Конечно, это не обязательно в RAII и обычно было бы просто ненужным усложнением.

person Dmitry Yudakov    schedule 05.11.2010