Здравствуйте, Аноним, Вы писали:
А>Конечно,все объекты можно через new создавать и не парится,но вдруг "кто-то" не через нью создаст,а механизм подсчета уже присутствует.
если "кто-то" на стеке объект с подсчетом ссылок создаст, то узнает он об этом очень быстро
. А если нужно гарантированное создание через new, то можно констукторы и оператор присваивания в private запихнуть и создавать объекты с помощью фабрики
Здравствуйте, Аноним, Вы писали:
А>Конечно,все объекты можно через new создавать и не парится,но вдруг "кто-то" не через нью создаст,а механизм подсчета уже присутствует.
Начать можно с запрещения создания объекта не в куче — делаем конструкторы и деструктор protected, а дальше —
class derived : public base
{
protected:
//
// Чтобы можно было наследоваться
derived(void);
~derived(void);
public:
//
// Вот с помошью этой функции клиенты и будут создавать объекты класса
static smart_ptr<derived> create_instance(void)
{ return smart_ptr<derived>(new derived()); }
};
Дальше спрашиваем: зачем нам это надо?
Допустим хочу использовать механизм подсчета ссылок для недопущения утечек памяти. Есть Add() и Relese() соответсвенно в базовом классе отслеживаемых объектов.
В программизме на C++ и без того мелочей всяких хватает, а если вы еще и будете сами за ссылками следить, так ваапсче свихнетесь. Оно вам надобно? Могу поспорить, что нет. А посему используйте проверенный (не)интрузивный умный указатель и занимайтесь более важными делами.
Но если же вы все же хотите сами управлять всеми ссылками, то лучше воспользуйтесь каким-нибудь гибко настраиваемым умным указателем (типа boost::shared_ptr с его deleter'ом, но только тсссс!) или же (если Бюст не нужен) посмотреть в Loki и там почерпнуть вдохновения (либо сразу код) для создания самопального велосипеда под девизом "Policy-Based Smart Pointer в массы!" (без иронии). Настоятельно рекомендуется прочесть соответствующую главу Александреску.