Нужно ли иметь статические конструкторы, когда мы следуем «RAII» -произведению вещей в C ++? - PullRequest
2 голосов
/ 05 ноября 2010

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

Ответы [ 3 ]

4 голосов
/ 05 ноября 2010

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

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

1 голос
/ 05 ноября 2010

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

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

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

1 голос
/ 05 ноября 2010

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

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

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

...