> Кому может понадобиться создавать класс, от которого низя унаследосаться???
Ударенным на голову Java-программёрам.
По теме:
class A
{
private:
A();
public:
A( const A& );
~A();
static A create();
}
int main()
{
A a = A::create();
}
>Минус твоего решения - нельзя создовать объекты на стеке
Это не проблема.
#include <new>
class A{
private:
A(){}
public:
~A(){}
static A* create(){return new A;}
static A* create(void* buf){return new(buf) A;}
};
template<class X> class auto_destroy{
public:
auto_destroy(X* p):ptr(p){}
~auto_destroy(){ptr->~X();}
operator X*(){return ptr;}
X* operator ->(){return ptr;}
private:
auto_destroy(){}
auto_destroy(const auto_destroy<X>&){}
auto_destroy<X>& operator=(const auto_destroy<X>&){return *this;}
X* ptr;
};
int main()
{
char buf[sizeof(A)];
auto_destroy<A> ad(A::create(buf));
}
>в таком виде код не компилится
В твоем компилится. Не понимаю для чего нужен класс, объект которого
нельзя создать?
с каких это пор для non-dependent names пишется typename ?
этот workaround работает, кстати, только для gcc у меня, для интела не работает, даже с typename :)
а если вот так:
- friend class friender::type;
+typedef friender::type friend_type;
+friend friend_type;
то работает для icc, и не работает для gcc :)
т.к. templated friends запрещены стандартом, то в каждом компиляторе workaround свой, если он вообще есть.
comeau вообще не пропускает ни в каком варианте код, хотя юзает тот же фронтент EDG, что и icc.
обломс :)
хотя вот проще гораздо придумал :)
работает везде где получилось потестить, да и чего бы ему не работать.
template<class Derived> class sealed_base {
protected:
sealed_base() {}
};
struct sealed_class : virtual private sealed_base<sealed_class> {};
struct sealed_child_class : public sealed_class {};
int main() {
sealed_class s;
// sealed_child_class child; // compile-time error
return 0;
}
такое решение недостаточно параноидально.
Помниться под билдером (на виндах) чего то я мутил такое свое... и у базового класса виджетовского какие то поля/методы были протектед, типа токо для наследников. Ну пришлось залезть в нидер и перенести это шаловливыми рученками в паблик секцию. "Можно придумать защиту от дурака, но только от неизобритательного"
Так что проситься в спп модуле в конструктор загнать какой нить код, котрый валил бы приложение нах...модуль поставлять в бинарном виде, исходников не давать:-)