Как запретить создавать объект на стеке?
От: _Winnie Россия C++.freerun
Дата: 19.10.05 10:56
Оценка: :)
Обычно отвечают "сделай private конструктор и порождающую функцию". Но это pain и bore писать для каждого класса такую функцию. А написать обобщенную невозможно. Но всё гораздо проще. Не нужно обобщенной Create. Сделаем обобщённый Destroy. Всё равно нужно что-то писать, но уже гораздо меньше.

Ответ:

//maybe, boost::checked_delete ?
template <class T>
void kill(T *p) 
{
    (void)sizeof(T);
    delete p;
}




class X
{
private:
    virtual ~X() {}
    friend void kill<X>(X *x);
};

int main()
{
    {
        X *p = new X;
        kill(p); //OK.
    }

    {
        X x; 
        //error: `virtual X::~X()' is private
    }  
}
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Как запретить создавать объект на стеке?
От: Bell Россия  
Дата: 19.10.05 11:15
Оценка:
Здравствуйте, _Winnie, Вы писали:

Едея не нова . У Майерса в "More effective C++", правило 27, описывается подобный подход с закрытым деструктором, только он предлагает для уничтожения использовать функцию-член, что, ИМХО, более правильно, т.к. не требует никаких внешних функций.


class test
{
   ~test() {}
public:
   void destroy() { delete this; }
};

test t;//error

int main()
{
   test t1;//error
   test* t2 = new test();//ok
   delete t2;//error
   t2->destroy();//ok
   return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re: Как запретить создавать объект на стеке?
От: jazzer Россия Skype: enerjazzer
Дата: 19.10.05 11:25
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Обычно отвечают "сделай private конструктор и порождающую функцию". Но это pain и bore писать для каждого класса такую функцию. А написать обобщенную невозможно. Но всё гораздо проще. Не нужно обобщенной Create. Сделаем обобщённый Destroy. Всё равно нужно что-то писать, но уже гораздо меньше.


Приватным конструктор делать не надо, иначе не сможешь делать new, а это в наши планы не входит.
На самом деле, достаточно сделать закрытым деструктор.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Как запретить создавать объект на стеке?
От: MaximE Великобритания  
Дата: 19.10.05 11:30
Оценка: 34 (6) +4 :))) :))) :))) :))) :))) :)))
On Wed, 19 Oct 2005 14:56:17 +0400, _Winnie <23256@users.rsdn.ru> wrote:

> Обычно отвечают "сделай private конструктор и порождающую функцию".


В то время, когда правильный ответ: "Это нафиг не никому надо, займись лучше делом."

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re: Как запретить создавать объект на стеке?
От: Erop Россия  
Дата: 19.10.05 11:41
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Обычно отвечают "сделай private конструктор и порождающую функцию". Но это pain и bore писать для каждого класса такую функцию. А написать обобщенную невозможно. Но всё гораздо проще. Не нужно обобщенной Create. Сделаем обобщённый Destroy. Всё равно нужно что-то писать, но уже гораздо меньше.


А может лучше assert в конструкторе на то, что this не слишком отличается от адреса какой-то переменной на стеке?

Но конечно "ещё более правильный" совет дал Maxim Yegorushkin здесь
Автор: MaximE
Дата: 19.10.05
+1
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Как запретить создавать объект на стеке?
От: sch  
Дата: 19.10.05 12:46
Оценка: :))) :)
ME>В то время, когда правильный ответ: "Это нафиг не никому надо, займись лучше делом."

Нет, Maxim Yegorushkin, мы не позволим тебе заставить _Winnie заняться делом.
Ибо в его творениях мировой юмор приобретает гораздо больше, чем теряет программирование.
Re[2]: Как запретить создавать объект на стеке?
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 19.10.05 12:49
Оценка:
Здравствуйте, MaximE, Вы писали:

>> Обычно отвечают "сделай private конструктор и порождающую функцию".


ME>В то время, когда правильный ответ: "Это нафиг не никому надо, займись лучше делом."


Максим, а ты действительно считаешь, что это нафиг никому не надо?
Ведь такие вещи как минимум способствуют лучшему пониманию языка
Re: Как запретить создавать объект на стеке?
От: __LP  
Дата: 19.10.05 12:57
Оценка: :))) :))
Здравствуйте, _Winnie, Вы писали:

_W>Обычно отвечают "сделай private конструктор и порождающую функцию". Но это pain и bore писать для каждого класса такую функцию. А написать обобщенную невозможно. Но всё гораздо проще. Не нужно обобщенной Create. Сделаем обобщённый Destroy. Всё равно нужно что-то писать, но уже гораздо меньше.


Идея — супер! Пора бы тебе для нее и название подобрать... Вот мой вариант:
(c) _Winnie Fast Antistack Idiom. (WFAI) :)
C++ можно выучить за 21 день! ...если дни — полярные.
Re[3]: Как запретить создавать объект на стеке?
От: MaximE Великобритания  
Дата: 19.10.05 13:15
Оценка: -2
Здравствуйте, Alxndr, Вы писали:

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


>>> Обычно отвечают "сделай private конструктор и порождающую функцию".


ME>>В то время, когда правильный ответ: "Это нафиг не никому надо, займись лучше делом."


A>Максим, а ты действительно считаешь, что это нафиг никому не надо?


Действительно.

A>Ведь такие вещи как минимум способствуют лучшему пониманию языка


Не отрицаю возможной образовательной ценности, но отрицаю практическую ценность запретов вообще.

К примеру, в Python нет спецификаторов доступа, и ничего — все довольны. А посмотрите в код boost::multi_index, сколько усилий было затрачено на расстановку спецификаторов доступа, сколько макросов совместимости навернуто. А ради чего? Я не могу вспомнить за свою практику случая, когда бы я пытался вызвать непубличную ф-цию boost::multi_index, std::map или какого другого класса.

Зачем запрещать создавать объекты где угодно, зачем запрещать наследовать от своих классов? От всех наивных программистов все равно не защититься.
Re[4]: Как запретить создавать объект на стеке?
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 19.10.05 13:27
Оценка:
Здравствуйте, MaximE, Вы писали:

A>>Ведь такие вещи как минимум способствуют лучшему пониманию языка


ME>Не отрицаю возможной образовательной ценности, но отрицаю практическую ценность запретов вообще.


Пардон, а, например, статическая типизация в C++ — это ведь тоже своего рода система запретов?

ME>К примеру, в Python нет спецификаторов доступа, и ничего — все довольны. А посмотрите в код boost::multi_index, сколько усилий было затрачено на расстановку спецификаторов доступа, сколько макросов совместимости навернуто. А ради чего?


Может, ради "защиты от дурака"?

ME>Я не могу вспомнить за свою практику случая, когда бы я пытался вызвать непубличную ф-цию boost::multi_index, std::map или какого другого класса.


Поэтому ты считаешь, что это для всех бесполезно?

ME>Зачем запрещать создавать объекты где угодно, зачем запрещать наследовать от своих классов? От всех наивных программистов все равно не защититься.


Не ты ли недавно рассказывал, что 80% (с цифрой могу соврать) твоих классов являются некопируемыми?
Re[4]: Как запретить создавать объект на стеке?
От: srggal Украина  
Дата: 19.10.05 13:36
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>А ради чего? Я не могу вспомнить за свою практику случая, когда бы я пытался вызвать непубличную ф-цию boost::multi_index, std::map или какого другого класса.


А как Вы, уважаемый Максим, узнаёте, какую функцию Вам не стоит вызывать ?

Предвосхищу ответ:
1) Из документации;
2) Если правильная архитектура, то "приватные" функции не прийдет в голову вызывать.

Касательно 1) — приходим у выводу что спецификаторы доступа делает код в каком-то смысле самодокументируемым
Касательно 2) — есть контр пример NVI
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: Как запретить создавать объект на стеке?
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 19.10.05 13:38
Оценка:
Здравствуйте, srggal, Вы писали:

S>2) Если правильная архитектура, то "приватные" функции не прийдет в голову вызывать.


<...>

S>Касательно 2) — есть контр пример NVI


Не вполне понятно, почему NVI — контрпример
Там private функция замещается, а не вызывается.
Re[5]: Как запретить создавать объект на стеке?
От: MaximE Великобритания  
Дата: 19.10.05 13:41
Оценка:
On Wed, 19 Oct 2005 17:27:54 +0400, Alxndr <14348@users.rsdn.ru> wrote:

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

>
> A>>Ведь такие вещи как минимум способствуют лучшему пониманию языка
>
> ME>Не отрицаю возможной образовательной ценности, но отрицаю практическую ценность запретов вообще.
>
> Пардон, а, например, статическая типизация в C++ — это ведь тоже своего рода система запретов?

Это полезная вещь, не раз помогала.

[]

> ME>Я не могу вспомнить за свою практику случая, когда бы я пытался вызвать непубличную ф-цию boost::multi_index, std::map или какого другого класса.

>
> Поэтому ты считаешь, что это для всех бесполезно?

Потому что не знаю людей, кого бы это спасло от бага на этапе компиляции.

> ME>Зачем запрещать создавать объекты где угодно, зачем запрещать наследовать от своих классов? От всех наивных программистов все равно не защититься.

>
> Не ты ли недавно рассказывал, что 80% (с цифрой могу соврать) твоих классов являются некопируемыми?

Это несколько из другой оперы. В С/С++ нет нотации не-value типа, поэтому приходится ее симулировать хэком с private конструктором копий и оператора присваивания.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0 beta
Re[5]: Как запретить создавать объект на стеке?
От: MaximE Великобритания  
Дата: 19.10.05 13:46
Оценка:
On Wed, 19 Oct 2005 17:36:04 +0400, srggal <21794@users.rsdn.ru> wrote:

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

>
> ME>А ради чего? Я не могу вспомнить за свою практику случая, когда бы я пытался вызвать непубличную ф-цию boost::multi_index, std::map или какого другого класса.
>
> А как Вы, уважаемый Максим, узнаёте, какую функцию Вам не стоит вызывать ?

Из кода или комментария.

В том же Python ф-ции, которые не стоит вызывать из пользовательского кода оканчиваются на _. Но если очень хочется вызвать — никто запрещать не будет, caveat emptor.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0 beta
Re[6]: Как запретить создавать объект на стеке?
От: srggal Украина  
Дата: 19.10.05 13:47
Оценка:
Здравствуйте, Alxndr, Вы писали:

S>>Касательно 2) — есть контр пример NVI


A>Не вполне понятно, почему NVI — контрпример

A>Там private функция замещается, а не вызывается.

ТОнкость этого Архитектурного решения состоит на мой взгляд в том,
что в руках потомках не оказывается способов воспользоваться замещенной функцией, ее использование возможно исключительно в Базовом классе. И именно это отличает NVI от шаблонного метода ( если не ошибаюсь )
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[6]: Как запретить создавать объект на стеке?
От: srggal Украина  
Дата: 19.10.05 13:50
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Из кода или комментария.


ME>В том же Python ф-ции, которые не стоит вызывать из пользовательского кода оканчиваются на _. Но если очень хочется вызвать — никто запрещать не будет, caveat emptor.


Ок, с питоном понятно, вопросов нет, но его Вы привели в качестве примера что эизнь на марсе есть, а как же с С++, что Вы скажете на это:

А как Вы, уважаемый Максим, узнаёте, какую функцию Вам не стоит вызывать ?

Предвосхищу ответ:
1) Из документации;
2) Если правильная архитектура, то "приватные" функции не прийдет в голову вызывать.

Касательно 1) — приходим у выводу что спецификаторы доступа делает код в каком-то смысле самодокументируемым
Касательно 2) — есть контр пример NVI


ЗЫ Интересует Ваше мнение по этому вопросу.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[7]: Как запретить создавать объект на стеке?
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 19.10.05 13:52
Оценка:
Здравствуйте, srggal, Вы писали:

S>ТОнкость этого Архитектурного решения состоит на мой взгляд в том...


Ясно. Просто не к месту был употреблен термин "контрпример"
Re[7]: Как запретить создавать объект на стеке?
От: MaximE Великобритания  
Дата: 19.10.05 13:55
Оценка: +1 :)
Здравствуйте, srggal, Вы писали:

S>

S>А как Вы, уважаемый Максим, узнаёте, какую функцию Вам не стоит вызывать ?

S>Предвосхищу ответ:
S>1) Из документации;
S>2) Если правильная архитектура, то "приватные" функции не прийдет в голову вызывать.

S>Касательно 1) — приходим у выводу что спецификаторы доступа делает код в каком-то смысле самодокументируемым
S>Касательно 2) — есть контр пример NVI


S>ЗЫ Интересует Ваше мнение по этому вопросу.


Из кода или комментария.

Re[6]: Как запретить создавать объект на стеке?
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 19.10.05 14:02
Оценка:
Здравствуйте, MaximE, Вы писали:

>> Не ты ли недавно рассказывал, что 80% (с цифрой могу соврать) твоих классов являются некопируемыми?


ME>Это несколько из другой оперы. В С/С++ нет нотации не-value типа, поэтому приходится ее симулировать хэком с private конструктором копий и оператора присваивания.


Извини, не понял: что мешает сделать простой комментарий
// Эта структура не должна копироваться!
struct MyStruct
{
    ...
};

Если сильно приспичило — копируй, caveat emptor — в комментарии.

P.S. Я ни в коем случае не хочу тебе "поймать" или еще что-то там — я хочу разобраться и понимать этот язык лучше
Re[7]: Как запретить создавать объект на стеке?
От: LuciferMoscow Россия  
Дата: 19.10.05 14:09
Оценка:
Здравствуйте, Alxndr, Вы писали:

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


>>> Не ты ли недавно рассказывал, что 80% (с цифрой могу соврать) твоих классов являются некопируемыми?


ME>>Это несколько из другой оперы. В С/С++ нет нотации не-value типа, поэтому приходится ее симулировать хэком с private конструктором копий и оператора присваивания.


A>Извини, не понял: что мешает сделать простой комментарий

A>
A>// Эта структура не должна копироваться!
A>struct MyStruct
A>{
A>    ...
A>};
A>

A>Если сильно приспичило — копируй, caveat emptor — в комментарии.

A>P.S. Я ни в коем случае не хочу тебе "поймать" или еще что-то там — я хочу разобраться и понимать этот язык лучше

Смотри:
class SomeNonCopyAbleClass;

void Foo( SomeNonCopyAbleClass /*тут должна быть передача параметра по ссылке, но меня эта клавиша сломалась*/qwerty );

Далее, что происходит: в SomeNonCopyAbleClass есть некоторый хендел.... Продолжать надо или уже понятно?
Re[8]: Как запретить создавать объект на стеке?
От: srggal Украина  
Дата: 19.10.05 14:10
Оценка:
Здравствуйте, MaximE, Вы писали:

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


S>>

S>>А как Вы, уважаемый Максим, узнаёте, какую функцию Вам не стоит вызывать ?

S>>Предвосхищу ответ:
S>>1) Из документации;
S>>2) Если правильная архитектура, то "приватные" функции не прийдет в голову вызывать.

S>>Касательно 1) — приходим у выводу что спецификаторы доступа делает код в каком-то смысле самодокументируемым
S>>Касательно 2) — есть контр пример NVI


S>>ЗЫ Интересует Ваше мнение по этому вопросу.


ME>

ME>Из кода или комментария.


Я Ступил

Т.е. Ответ 1)
И мой коментарий 1)

Ок
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[8]: Как запретить создавать объект на стеке?
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 19.10.05 14:17
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Смотри:

LM>
LM>class SomeNonCopyAbleClass;

LM>void Foo( SomeNonCopyAbleClass /*тут должна быть передача параметра по ссылке, но меня эта клавиша сломалась*/qwerty );
LM>

LM>Далее, что происходит: в SomeNonCopyAbleClass есть некоторый хендел.... Продолжать надо или уже понятно?

Я понимаю, зачем делать класс некопируемым. Я НЕ понимаю, почему это пример из другой оперы: там мы делаем закрытой одну функцию-член, здесь — другую.
Re[9]: Как запретить создавать объект на стеке?
От: LuciferMoscow Россия  
Дата: 19.10.05 14:31
Оценка:
Здравствуйте, Alxndr, Вы писали:

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


LM>>Смотри:

LM>>
LM>>class SomeNonCopyAbleClass;

LM>>void Foo( SomeNonCopyAbleClass /*тут должна быть передача параметра по ссылке, но меня эта клавиша сломалась*/qwerty );
LM>>

LM>>Далее, что происходит: в SomeNonCopyAbleClass есть некоторый хендел.... Продолжать надо или уже понятно?

A>Я понимаю, зачем делать класс некопируемым. Я НЕ понимаю, почему это пример из другой оперы: там мы делаем закрытой одну функцию-член, здесь — другую.

Потому, что я огреб БОЛЬШИЕ проблемы из-за ОДНОГО символа. Мне показалось, что это хороший пример.
Re[7]: Как запретить создавать объект на стеке?
От: MaximE Великобритания  
Дата: 19.10.05 14:37
Оценка: 3 (1) :)
On Wed, 19 Oct 2005 18:02:33 +0400, Alxndr <14348@users.rsdn.ru> wrote:

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

>
>>> Не ты ли недавно рассказывал, что 80% (с цифрой могу соврать) твоих классов являются некопируемыми?
>
> ME>Это несколько из другой оперы. В С/С++ нет нотации не-value типа, поэтому приходится ее симулировать хэком с private конструктором копий и оператора присваивания.
>
> Извини, не понял: что мешает сделать простой комментарий
>
> // Эта структура не должна копироваться!
> struct MyStruct
> {
>     ...
> };
>

> Если сильно приспичило — копируй, caveat emptor — в комментарии.

Мешает то, что C++ сгенерирует за меня вышеупомянутые члены (почему бы ему еще не сгенерить канонические ф-ции-члены foo и bar?). Если бы эти члены не генерились компилятором, т.е. если бы С++ по-умолчанию не предполагал, что это value-тип, тот хэк не понадобился бы.

Вобщем-то, здесь можно обойтись без private, достаточно объявить члены, но не определить из. Тогда ошибка отложится на этап линковки и диагностика будет менее подробной, что не удобно и не приемлимо для библиотек, которые могут иметь неразрешенные ссылки.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0 beta
Re: Зачем запрещать создавать объект на стеке? :)
От: Erop Россия  
Дата: 19.10.05 15:01
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Обычно отвечают "сделай private конструктор и порождающую функцию". Но это pain и bore писать для каждого класса такую функцию. А написать обобщенную невозможно. Но всё гораздо проще. Не нужно обобщенной Create. Сделаем обобщённый Destroy. Всё равно нужно что-то писать, но уже гораздо меньше.


А таки открой тайну, зачем это надо?
Тут развёлся флейм по поводу того, что тип анадо не надо, но никто примера когда надо так и не привёл.
Может ты откроешь, зачем тебе это понадобилось?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Зачем запрещать создавать объект на стеке? :)
От: srggal Украина  
Дата: 19.10.05 15:31
Оценка:
Здравствуйте, Erop, Вы писали:

E>А таки открой тайну, зачем это надо?

E>Тут развёлся флейм по поводу того, что тип анадо не надо, но никто примера когда надо так и не привёл.
E>Может ты откроешь, зачем тебе это понадобилось?

OS Симбиан, в которой рекомендкется очень обдуманно использовать стэк.

Это так, навскидку
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: Как запретить создавать объект на стеке?
От: srggal Украина  
Дата: 19.10.05 15:33
Оценка: +1 :)
Здравствуйте, __LP, Вы писали:

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


__L>Идея — супер! Пора бы тебе для нее и название подобрать... Вот мой вариант:

__L>(c) _Winnie Fast Antistack Idiom. (WFAI)

Мои 5копеек:
А все Идиомы от известного кутюрье собрать в одно месте и как нить назвать, неброско, но со вкусом:
All _Winnie Idiom (AWI)
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[8]: Как запретить создавать объект на стеке?
От: srggal Украина  
Дата: 19.10.05 15:57
Оценка:
Здравствуйте, Alxndr, Вы писали:

A>Ясно. Просто не к месту был употреблен термин "контрпример"


Дело в том, Коллега, что термин этот был употреблен ИМХО правильно.

Поскольку

...
2) Если правильная архитектура, то "приватные" функции не прийдет в голову вызывать.
...
Касательно 2) — есть контр пример NVI


Поскольку, вариант ответа 2 — подразумевает Архитектуру и речь бы шла о том, что при правильной Архитектуре вопросы приватности не должны возникать,

то я сразу привео контр пример — NVI — Архитектурное решение, которое основано на использовании приватности. Что и показывает, естественно в общем случае, необоснованность 2го варианта ответа.

Но коварный Максим скрылся за

caveat emptor


... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: Зачем запрещать создавать объект на стеке? :)
От: _Winnie Россия C++.freerun
Дата: 19.10.05 18:17
Оценка: +1 :)
Здравствуйте, Erop, Вы писали:

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


E>А таки открой тайну, зачем это надо?

E>Тут развёлся флейм по поводу того, что тип анадо не надо, но никто примера когда надо так и не привёл.
E>Может ты откроешь, зачем тебе это понадобилось?

Просто иногда на rsdn спрашивают... мне это нафиг не нужно, я MaximE поставил плюсик в сообщении "тебе это не нужно"
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: Как запретить создавать объект на стеке?
От: Аноним  
Дата: 19.10.05 18:20
Оценка:
ME>В то время, когда правильный ответ: "Это нафиг не никому надо, займись лучше делом."

Тут ты не прав. примеры:

COM объект должен запрещать создавать себя на стеке, Так же класс виндовского окошка должен запрещать это делать.

В принципе любой класс который занимается самоуничтожением.

George.
Re[3]: Как запретить создавать объект на стеке?
От: MaximE Великобритания  
Дата: 19.10.05 18:41
Оценка:
Здравствуйте, Аноним, Вы писали:

ME>>В то время, когда правильный ответ: "Это нафиг не никому надо, займись лучше делом."


А>Тут ты не прав. примеры:


А>COM объект должен запрещать создавать себя на стеке,


COM объект создается фабрикой. Ты — автор кокласса и фабрики (уже забыл, но в ATL вроде и фабрику самому писать не нужно). Ты настолько рассеян, что твоя фабрика может по ошибке создать объект на стэке?

А>Так же класс виндовского окошка должен запрещать это делать.


Контр-пример — оконные классы MFC.

А>В принципе любой класс который занимается самоуничтожением.


Не помню, сталкивался ли с таким дизайном. Классы, доступные пользователю, так себя не могут вести — ты создал объект по new, имеешь на него указатель, а он возьми и удали себя, оставив тебя с dangling pointer?
Re[3]: Как запретить создавать объект на стеке?
От: _Winnie Россия C++.freerun
Дата: 19.10.05 20:13
Оценка:
Здравствуйте, srggal, Вы писали:

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


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


__L>>Идея — супер! Пора бы тебе для нее и название подобрать... Вот мой вариант:

__L>>(c) _Winnie Fast Antistack Idiom. (WFAI)

S>Мои 5копеек:

S> А все Идиомы от известного кутюрье собрать в одно месте и как нить назвать, неброско, но со вкусом:
S> All _Winnie Idiom (AWI)

Winnie Inrisive Pointer
Автор: _Winnie
Дата: 23.12.04
Правильно работающая программа — просто частный случай Undefined Behavior
Re[4]: Как запретить создавать объект на стеке?
От: _Winnie Россия C++.freerun
Дата: 19.10.05 20:13
Оценка:
Здравствуйте, _Winnie, Вы писали:
_W>Здравствуйте, srggal, Вы писали:
_W>Winnie Inrisive Pointer
Автор: _Winnie
Дата: 23.12.04
Inrisive -> Intrusive
Правильно работающая программа — просто частный случай Undefined Behavior
Re[4]: Как запретить создавать объект на стеке?
От: Erop Россия  
Дата: 19.10.05 22:23
Оценка:
Здравствуйте, MaximE, Вы писали:

А>>Так же класс виндовского окошка должен запрещать это делать.

ME>Контр-пример — оконные классы MFC.

А>>В принципе любой класс который занимается самоуничтожением.

ME>Не помню, сталкивался ли с таким дизайном. Классы, доступные пользователю, так себя не могут вести — ты создал объект по new, имеешь на него указатель, а он возьми и удали себя, оставив тебя с dangling pointer?

Ну в том же MFC бывают оконные классы, экземплярами которых никто не владеет, и они разрушают себя себя сами по OnPostNcDestroy().
Например, такими являются главные окна MDI MFC приложений.

Но в целом я согласен
Окна часто оказываются чьими-то полями или ещё как-то с кем-то связанными.
Ну и вообще те объекты, которые сами себе говорят delete this, обычно и так всё хорошо запрещают. Так как первая же попытка разрушения таких объектов вызовет assert в куче, да и всё.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Зачем запрещать создавать объект на стеке? :)
От: Erop Россия  
Дата: 19.10.05 22:27
Оценка:
Здравствуйте, srggal, Вы писали:

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


E>>А таки открой тайну, зачем это надо?

E>>Тут развёлся флейм по поводу того, что тип анадо не надо, но никто примера когда надо так и не привёл.
E>>Может ты откроешь, зачем тебе это понадобилось?

S>OS Симбиан, в которой рекомендкется очень обдуманно использовать стэк.


S>Это так, навскидку


Спасибо, конечно за пример, но не совсем понятно зачем под OS Симбиан запрещать это для каких-то объектов?
Казалось бы весь стиль программирования будет направлен на то, чтобы избежать объектов на стеке
Тем более, что описанный трюк ещё запрещает объектам быть и полями

Может стоит вообще организовать исскуственный "стек", в котором лежат структуры, соответсвующие автоматическим переменным, и на входе в функцию такой "фрейм" в стек класть, а на выходе разрушать?

ТОгда тем более описанный трюк будет вреден
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Как запретить создавать объект на стеке?
От: fulltick  
Дата: 20.10.05 05:55
Оценка:
Здравствуйте, _Winnie, Вы писали:

А если требуется разрешить наследование от подобных классов (например, для "самоудаляющихся" оконных объектов)? Ведь тогда деструктор или конструкторы нельзя делать заркытыми, только защищёнными. А это значит, что потомок может их вытащить наружу...
Re[5]: Как запретить создавать объект на стеке?
От: srggal Украина  
Дата: 20.10.05 10:41
Оценка:
Здравствуйте, _Winnie, Вы писали:

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

_W>>Здравствуйте, srggal, Вы писали:
_W>>Winnie Inrisive Pointer
Автор: _Winnie
Дата: 23.12.04
Inrisive -> Intrusive


Соглпсаен и поинтер в библиотеку тоже поместим
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: Зачем запрещать создавать объект на стеке? :)
От: srggal Украина  
Дата: 20.10.05 11:27
Оценка:
Здравствуйте, Erop, Вы писали:

E>Спасибо, конечно за пример, но не совсем понятно зачем под OS Симбиан запрещать это для каких-то объектов?

E>Казалось бы весь стиль программирования будет направлен на то, чтобы избежать объектов на стеке
E>Тем более, что описанный трюк ещё запрещает объектам быть и полями

E>Может стоит вообще организовать исскуственный "стек", в котором лежат структуры, соответсвующие автоматическим переменным, и на входе в функцию такой "фрейм" в стек класть, а на выходе разрушать?


E>ТОгда тем более описанный трюк будет вреден


Самомму не понятно
Но Вы хотели пример, я привел первый мало-мальски подходящий пример.
Это не значит что я сам являюсь сторонником запретов создания на стэке.

Я сторонник запрета создания объекта в куче ( в некоторых случаях ), но к сожалению решения этой задачи пока не видел.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: Зачем запрещать создавать объект на стеке? :)
От: Bell Россия  
Дата: 20.10.05 11:33
Оценка: :)
Здравствуйте, srggal, Вы писали:

S>Я сторонник запрета создания объекта в куче ( в некоторых случаях ), но к сожалению решения этой задачи пока не видел.



class test
{
   static void* operator new(size_t n);
};

test t1;//ok
int main()
{
   test t2;//ok
   test* t3 = new test();//error
   return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re[6]: Зачем запрещать создавать объект на стеке? :)
От: srggal Украина  
Дата: 20.10.05 11:49
Оценка:
Здравствуйте, Bell, Вы писали:

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


B>
B>class test
B>{
B>   static void* operator new(size_t n);
B>};

B>test t1;//ok
B>int main()
B>{
B>   test t2;//ok
B>   test* t3 = new test();//error
B>   return 0;
B>}
B>


S>>Я сторонник запрета создания объекта в куче ( в некоторых случаях ), но к сожалению решения этой задачи пока не видел.


Виноват , нечеткая формулировка, выделенное следует понимать так:

Как определить, в общем случае, как создан объект: в куче или стэке ?

ЗЫ Ещё раз каюсь
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[7]: Зачем запрещать создавать объект на стеке? :)
От: Bell Россия  
Дата: 20.10.05 11:51
Оценка: +1
Здравствуйте, srggal, Вы писали:


S>Виноват , нечеткая формулировка, выделенное следует понимать так:


S>Как определить, в общем случае, как создан объект: в куче или стэке ?


В общем случае — никак, как говорил товарищ Майерс.
Любите книгу — источник знаний (с) М.Горький
Re[8]: Зачем запрещать создавать объект на стеке? :)
От: Pavel Chikulaev Россия  
Дата: 20.10.05 13:17
Оценка:
Здравствуйте, Bell, Вы писали:

B> В общем случае — никак, как говорил товарищ Майерс.

Не факт. Препроцессорная магия: Куча ifdef / elif как бусте для каждой платформы и error для новой
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.