А new нельзя как-нить переопределить? Я попробовал, но мне сказали, что я пытаюсь получить доступ к конструктору
__>Следует объявить конструктор защищенным и предоставить функцию создания объекта динамически : __>
__>class a
__>{
__>public:
__> static a* create() { return new a; }
__>protected:
__> a(){}
__>};
__>int main()
__>{
__> a* p = a::create(); // OK
__> a x; // Error
__>}
__>
Здравствуйте, Edge, Вы писали:
E>Здравствуйте, _nn_, Вы писали:
E>А new нельзя как-нить переопределить? Я попробовал, но мне сказали, что я пытаюсь получить доступ к конструктору
Не получится, конструктор защищенный.
А чем плохо создание объекта функцией ?
Здравствуйте, Edge, Вы писали:
E>Здравствуйте, _nn_, Вы писали:
__>>Не получится, конструктор защищенный. __>>А чем плохо создание объекта функцией ?
E>Проект сильно менять не хочется... А по рукам дать охота
if(_охота_дать_по_рукам)
_дать_по_рукам();
А может стоить подумать решить проблему другим способом ?
Здравствуйте, MaximE, Вы писали:
ME>Чтобы запретить создание объекта на стеке сделай деструктор непубличным,
и не сможешь удалить объект из хипа...
ME>в хипе — определи непубличный operator delete для класса.
и сможешь создавать и в стеке и в хипе, но из хипа не удалишь,
ME>>в хипе — определи непубличный operator delete для класса. E>и сможешь создавать и в стеке и в хипе,
5.3.4/8
A new expression obtains storage for the object by calling an allocation function (3.7.3.1). If the new expression terminates by throwing an exception, it may release storage by calling a deallocation function (3.7.3.2). If the allocated type is a nonarray type, the allocation function s name is operator new and the deallocation function s name is operator delete. If the allocated type is an array type, the allocation function s name is operator new[] and the deallocation function s name is operator delete[]. [Note: an implementation shall provide default definitions for the global allocation functions (3.7.3, 18.4.1.1, 18.4.1.2). A C++ program can provide alternative definitions of these functions (17.4.3.4) and/or classspecific versions (12.5). ]
12.5/8
Access to the deallocation function is checked statically. Hence, even though a different one might actually be executed, the statically visible deallocation function is required to be accessible. [Example: for the call on line //1 above, if B::operator delete() had been private, the delete expression would have been illformed. ]
> class no_heap
> {
> static void operator delete(void*, size_t);
> public:
> void destroy() { delete this; }
> };
>
> int main()
> {
> no_heap* p = new no_heap();
> return 0;
> }
>
> Компилица на ура !
Добавление пустого конструктора решит проблему.
gcc, видимо, делает такой shortcut: если у класса нет определенного конструктора, то исключение конструктором брошено быть не может, поэтому operator delete access check не делается. Я не уверен, позволен ли такой shortcut стандартом. comeau отказывается компилить этот код в любом случае.
Различное поведение компиляторов возможно связано с тем, что это не распространенная идиома, так как пробема, на мой взгляд, надуманная и в реальном коде я не встречал необходимости запрещать создание объектов на стэке / в хипе.