Каким образом реализуется запрещение создания экземпляра класса обычным методом
SomeClass myclass;
но одновременно допускается через оператор new
SomeClass *class = new SomeClass();
Здравствуйте, ice71crew, Вы писали:
I>Каким образом реализуется запрещение создания экземпляра класса обычным методом I>SomeClass myclass; I>но одновременно допускается через оператор new I>SomeClass *class = new SomeClass();
Сделать деструктор не публичным и добавить функцию для удаления объекта:
Здравствуйте, ice71crew, Вы писали:
I>Каким образом реализуется запрещение создания экземпляра класса обычным методом I>SomeClass myclass; I>но одновременно допускается через оператор new I>SomeClass *class = new SomeClass();
Попробуй переопредельть для класа операторы new и delete,
конмтруктор сделай protected
а деструктор оставь публычным (будет орато, што обект класа нет возможности уничтожить)
должно сработать
Здравствуйте, ice71crew, Вы писали:
I>Каким образом реализуется запрещение создания экземпляра класса обычным методом I>SomeClass myclass; I>но одновременно допускается через оператор new I>SomeClass *class = new SomeClass();
Здравствуйте, MaximE, Вы писали:
ME>Здравствуйте, Yuri, Вы писали:
Y>>Тогда уж лучше снабдить класс парой ф-йй Create/Destroy, а то создаем через new, уничтодаем через destroy, некрасиво
ME>Да, а если у класса 7 конструкторов, тебе придется написать 7 функций Create — вот это я называю красиво
А что, это очень сложно? Copy/paste и нет проблем.
Ты сам то, может и привыкнешь создавать через new, а удалять через destroy, но другие-то люди, кто будет пользовать твой класс привыкнут к такому изврату не сразу Все должно быть логично! Создание через new, уничтожение через delete — это логично, создание через new, создание через метод класса, уничтожение через метод класса — тоже логично, уничтожение через метод класса — изврат!
Здравствуйте, Yuri, Вы писали:
Y>А что, это очень сложно? Copy/paste и нет проблем.
Кто-то потом должен поддерживать твой copy/paste. Читать такой код тоже неудобно.
Y>Ты сам то, может и привыкнешь создавать через new, а удалять через destroy, но другие-то люди, кто будет пользовать твой класс привыкнут к такому изврату не сразу Все должно быть логично! Создание через new, уничтожение через delete — это логично, создание через new, создание через метод класса, уничтожение через метод класса — тоже логично, уничтожение через метод класса — изврат!
Не надо думать, что тебя окружают недоумки, так как все что ты видишь вокруг — это твое отражение.
Здравствуйте, MaximE, Вы писали:
ME>Здравствуйте, Yuri, Вы писали:
Y>>А что, это очень сложно? Copy/paste и нет проблем.
ME>Кто-то потом должен поддерживать твой copy/paste. Читать такой код тоже неудобно.
Y>>Ты сам то, может и привыкнешь создавать через new, а удалять через destroy, но другие-то люди, кто будет пользовать твой класс привыкнут к такому изврату не сразу Все должно быть логично! Создание через new, уничтожение через delete — это логично, создание через new, создание через метод класса, уничтожение через метод класса — тоже логично, уничтожение через метод класса — изврат!
ME>Не надо думать, что тебя окружают недоумки, так как все что ты видишь вокруг — это твое отражение.
Я так не считаю, возможно я выразился слишком резко, извиняюсь, но тем не менее я считаю, что создание через new, а уничтожение через метод класса что-то нето
Если бы я смотрел чужой код и увидел бы использование оператора new, то я бы ожидал встретить delete, встреча же метода класса вызвала бы у меня кучу вопросов, для ответа на которые мне пришлось бы лезть в исходник (а если его нет!) или в доку или к автору — а так все ясно и очевидно:
new/delete
Create/Destroy
Здравствуйте, Yuri, Вы писали:
Y>Если бы я смотрел чужой код и увидел бы использование оператора new, то я бы ожидал встретить delete, встреча же метода класса вызвала бы у меня кучу вопросов, для ответа на которые мне пришлось бы лезть в исходник (а если его нет!) или в доку или к автору — а так все ясно и очевидно: Y>new/delete Y>Create/Destroy
Если я вижу new, то я ожидаю увидеть умный указатель и не желаю видеть никаких delete. И никаких new[] и delete[] вообще.
Здравствуйте, MaximE, Вы писали:
ME>Если я вижу new, то я ожидаю увидеть умный указатель и не желаю видеть никаких delete. И никаких new[] и delete[] вообще.
Если делать через упихивание деструктора в приват, то стандартные умные указатели ака shared_ptr и auto_ptr откажутся работать. Видимо придется делать свой с нужной политикой убиения.
Здравствуйте, Юнусов Булат, Вы писали:
ЮБ>Здравствуйте, MaximE, Вы писали:
ME>>Если я вижу new, то я ожидаю увидеть умный указатель и не желаю видеть никаких delete. И никаких new[] и delete[] вообще.
ЮБ>Если делать через упихивание деструктора в приват, то стандартные умные указатели ака shared_ptr и auto_ptr откажутся работать. Видимо придется делать свой с нужной политикой убиения.
class no_heap_please
{
private:
~no_heap_please();
friend class std::auto_ptr<no_heap_please>;public:
void destroy() { delete this; }
};
Здравствуйте, Юнусов Булат, Вы писали:
ЮБ>Здравствуйте, MaximE, Вы писали:
ME>>Если я вижу new, то я ожидаю увидеть умный указатель и не желаю видеть никаких delete. И никаких new[] и delete[] вообще.
ЮБ>Если делать через упихивание деструктора в приват, то стандартные умные указатели ака shared_ptr и auto_ptr откажутся работать. Видимо придется делать свой с нужной политикой убиения.
Делать свой не придется, так как это уже сделали в boost-е, а вот политику убиения сделать нужно