MyClass o; // error
MyClass * o = new MyClass; // ok
Конечно, можно. Закройте его деструктор (сделайте его private
).
Чтобы удалить выделенный динамически объект, вам придется написать отдельную функцию - например, друга или статический член - для удаления, вроде
friend void destroy(MyClass* t) { delete t; }
...
MyClass * o = new MyClass;
...
destroy(o);
Если в первую очередь имеет значение сам факт создания в куче, и нет обязательного требования разрешать в клиентском коде запись вида new MyClass
, то вместо сокрытия деструктора можно подойти с другой стороны жизненного цикла объекта и сделать приватным конструктор, предоставив соответствующую create-функцию или даже семейство функций:
class MyClass {
MyClass();
public:
static MyClass* create() { return new MyClass; }
};
Теперь, чтобы не забыть сделать delete
объекта в нужный момент и не получить утечку памяти, разумно возвращать не сырой указатель, а std::unique_ptr
. Функция изменится так:
static std::unique_ptr<MyClass> create() { return std::unique_ptr<MyClass>(new MyClass); }
Однако, если мы пойдём ещё дальше и заменим std::unique_ptr<MyClass>(new MyClass)
на std::make_unique<MyClass>()
для уменьшения накладных расходов, то получим ошибку компиляции:
error: calling a private constructor of class 'MyClass'
Возникает это из-за того, что мы пытаемся вызвать наш приватный конструктор по сути вне класса MyClass
. Но это можно побороть следующим небольшим "хаком" - добавить приватный тип и использовать его в качестве дополнительного параметра для конструктора MyClass
, при этом сам конструктор снова сделать публичным. Итоговый пример:
class MyClass {
class tag {}; // скрытый от внешнего кода тип
public:
MyClass(const tag&) {}
static std::unique_ptr<MyClass> create() { return std::make_unique<MyClass>(tag()); }
};
int main() {
auto p = MyClass::create();
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пытаюсь вывести предложение с указанным искомым словом, но программа не выводит полностью всё предложение, а лишь часть текста
Добрый деньИмеется основная форма (ApplicationWindow), на которой есть активный элемент
Я вызываю QColorDialog примерно так:
Как используется boost::variant (в частности apply_visitor)?