Re[9]: Создание экземпляра только методом new
От: Yacha Россия  
Дата: 08.08.03 05:33
Оценка: 11 (2)
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Здравствуйте, MaximE, Вы писали:


ME>>Если я вижу new, то я ожидаю увидеть умный указатель и не желаю видеть никаких delete. И никаких new[] и delete[] вообще.


ЮБ>Если делать через упихивание деструктора в приват, то стандартные умные указатели ака shared_ptr и auto_ptr откажутся работать. Видимо придется делать свой с нужной политикой убиения.

Делать свой не придется, так как это уже сделали в boost-е, а вот политику убиения сделать нужно
struct killer
{
    void operator()(void const * p) const
    {
    delete p;
    }
};

class no_heap_please
{
private:
    ~no_heap_please();
    friend struct killer;
    
public:
};

...
boost::shared_ptr<no_heap_please> p(new no_heap_please, killer());
...
... << RSDN@Home 1.0 beta 6a >>
Re[3]: Создание экземпляра только методом new
От: MaximE Великобритания  
Дата: 07.08.03 13:55
Оценка: 1 (1) -1
Здравствуйте, Yuri, Вы писали:

Y>Тогда уж лучше снабдить класс парой ф-йй Create/Destroy, а то создаем через new, уничтодаем через destroy, некрасиво


Да, а если у класса 7 конструкторов, тебе придется написать 7 функций Create — вот это я называю красиво
Re[2]: Создание экземпляра только методом new
От: Yuri Россия http://spbdetails.ru
Дата: 07.08.03 13:18
Оценка: -1
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, ice71crew, Вы писали:



ME>Сделать деструктор не публичным и добавить функцию для удаления объекта:


ME>
ME>class no_heap_please
ME>{
ME>private:
ME>    ~no_heap_please();
    
ME>public:
ME>    void destroy() { delete this; }
ME>};
ME>


Тогда уж лучше снабдить класс парой ф-йй Create/Destroy, а то создаем через new, уничтодаем через destroy, некрасиво


class CTest {
protected:
    CTest();
    ~CTest();

public:
    static CTest *Create() {return new CTest;}
    void Destroy() {delete this;}
};
Take it easy.
Создание экземпляра только методом new
От: ice71crew Россия  
Дата: 05.08.03 18:41
Оценка:
Каким образом реализуется запрещение создания экземпляра класса обычным методом
SomeClass myclass;
но одновременно допускается через оператор new
SomeClass *class = new SomeClass();
-=Ай=-
Re: Создание экземпляра только методом new
От: MaximE Великобритания  
Дата: 05.08.03 18:47
Оценка:
Здравствуйте, ice71crew, Вы писали:

I>Каким образом реализуется запрещение создания экземпляра класса обычным методом

I>SomeClass myclass;
I>но одновременно допускается через оператор new
I>SomeClass *class = new SomeClass();

Сделать деструктор не публичным и добавить функцию для удаления объекта:

class no_heap_please
{
private:
    ~no_heap_please();
    
public:
    void destroy() { delete this; }
};
Re: Создание экземпляра только методом new
От: Andrij Украина  
Дата: 07.08.03 13:43
Оценка:
Здравствуйте, ice71crew, Вы писали:

I>Каким образом реализуется запрещение создания экземпляра класса обычным методом

I>SomeClass myclass;
I>но одновременно допускается через оператор new
I>SomeClass *class = new SomeClass();

Попробуй переопредельть для класа операторы new и delete,
конмтруктор сделай protected
а деструктор оставь публычным (будет орато, што обект класа нет возможности уничтожить)
должно сработать
... << RSDN@Home 1.1 beta 1 >>
make it simple as possible, but not simpler
Re: Создание экземпляра только методом new
От: MaximE Великобритания  
Дата: 07.08.03 14:00
Оценка:
Здравствуйте, ice71crew, Вы писали:

I>Каким образом реализуется запрещение создания экземпляра класса обычным методом

I>SomeClass myclass;
I>но одновременно допускается через оператор new
I>SomeClass *class = new SomeClass();

вообще, топик уже обсуждался: http://www.rsdn.ru/Forum/?mid=230612
Автор: MaximE
Дата: 01.04.03
Re[4]: Создание экземпляра только методом new
От: Yuri Россия http://spbdetails.ru
Дата: 07.08.03 14:05
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, Yuri, Вы писали:


Y>>Тогда уж лучше снабдить класс парой ф-йй Create/Destroy, а то создаем через new, уничтодаем через destroy, некрасиво


ME>Да, а если у класса 7 конструкторов, тебе придется написать 7 функций Create — вот это я называю красиво


А что, это очень сложно? Copy/paste и нет проблем.
Ты сам то, может и привыкнешь создавать через new, а удалять через destroy, но другие-то люди, кто будет пользовать твой класс привыкнут к такому изврату не сразу Все должно быть логично! Создание через new, уничтожение через delete — это логично, создание через new, создание через метод класса, уничтожение через метод класса — тоже логично, уничтожение через метод класса — изврат!
Take it easy.
Re[5]: Создание экземпляра только методом new
От: MaximE Великобритания  
Дата: 07.08.03 14:11
Оценка:
Здравствуйте, Yuri, Вы писали:

Y>А что, это очень сложно? Copy/paste и нет проблем.


Кто-то потом должен поддерживать твой copy/paste. Читать такой код тоже неудобно.

Y>Ты сам то, может и привыкнешь создавать через new, а удалять через destroy, но другие-то люди, кто будет пользовать твой класс привыкнут к такому изврату не сразу Все должно быть логично! Создание через new, уничтожение через delete — это логично, создание через new, создание через метод класса, уничтожение через метод класса — тоже логично, уничтожение через метод класса — изврат!


Не надо думать, что тебя окружают недоумки, так как все что ты видишь вокруг — это твое отражение.
Re[6]: Создание экземпляра только методом new
От: MaximE Великобритания  
Дата: 07.08.03 14:12
Оценка:
Здравствуйте, MaximE, Вы писали:

[]

Прости за импульсивность.
Re[6]: Создание экземпляра только методом new
От: Yuri Россия http://spbdetails.ru
Дата: 07.08.03 14:18
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, Yuri, Вы писали:


Y>>А что, это очень сложно? Copy/paste и нет проблем.


ME>Кто-то потом должен поддерживать твой copy/paste. Читать такой код тоже неудобно.


Y>>Ты сам то, может и привыкнешь создавать через new, а удалять через destroy, но другие-то люди, кто будет пользовать твой класс привыкнут к такому изврату не сразу Все должно быть логично! Создание через new, уничтожение через delete — это логично, создание через new, создание через метод класса, уничтожение через метод класса — тоже логично, уничтожение через метод класса — изврат!


ME>Не надо думать, что тебя окружают недоумки, так как все что ты видишь вокруг — это твое отражение.


Я так не считаю, возможно я выразился слишком резко, извиняюсь, но тем не менее я считаю, что создание через new, а уничтожение через метод класса что-то нето

Если бы я смотрел чужой код и увидел бы использование оператора new, то я бы ожидал встретить delete, встреча же метода класса вызвала бы у меня кучу вопросов, для ответа на которые мне пришлось бы лезть в исходник (а если его нет!) или в доку или к автору — а так все ясно и очевидно:
new/delete
Create/Destroy

Take it easy.
Re[7]: Создание экземпляра только методом new
От: MaximE Великобритания  
Дата: 07.08.03 14:40
Оценка:
Здравствуйте, Yuri, Вы писали:

Y>Если бы я смотрел чужой код и увидел бы использование оператора new, то я бы ожидал встретить delete, встреча же метода класса вызвала бы у меня кучу вопросов, для ответа на которые мне пришлось бы лезть в исходник (а если его нет!) или в доку или к автору — а так все ясно и очевидно:

Y>new/delete
Y>Create/Destroy

Если я вижу new, то я ожидаю увидеть умный указатель и не желаю видеть никаких delete. И никаких new[] и delete[] вообще.
Re[8]: Создание экземпляра только методом new
От: Юнусов Булат Россия  
Дата: 08.08.03 01:56
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Если я вижу new, то я ожидаю увидеть умный указатель и не желаю видеть никаких delete. И никаких new[] и delete[] вообще.


Если делать через упихивание деструктора в приват, то стандартные умные указатели ака shared_ptr и auto_ptr откажутся работать. Видимо придется делать свой с нужной политикой убиения.
Re[9]: Создание экземпляра только методом new
От: MaximE Великобритания  
Дата: 08.08.03 04:39
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Здравствуйте, 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; }
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.