Programación General > C/C++
Constructor Privado
Ruben3d:
--- Citar ---Sorry , ya dije q no se si estaría libre de errores y q me basaba en una "idea" que tuve en Java...
--- Fin de la cita ---
:o Siento haber parecido un poco brusco. No lo pretendía.
Un saludo.
Ruben3d
QliX=D!:
Bueno si eso es un patron, se llama Singleton y podras encontrar mas info al respecto en:
http://www.geocities.com/cordayuk/Direct3D...anda/diseno.htm
Y la guia completita de patrones (hay mas pero estos son lo de Gamma et al.)
http://webs.teleprogramadores.com/patrones/
Tambien esta el Singleton :D
Slds.-
ToTeX:
Hola, yo uso siempre singletons en mis juegos y en otros programas donde necesito instancias unicas. He visto hartos ejemplos en internet pero ninguno me dejo satisfecho, asi que me hice una propia. La ventaja de la implementacion que les presento es que uno solo deriva cualquier clase de CSinlgeton y punto. Solo hay que tener presente que hay que llamar al destructor al fin del programa, pues la instancia unica se crea mediante un new, por lo tanto no se llama al destructor automaticamente. Otro punto es que el programa al partir crea todos los singletons, por lo tanto no se pueden hacer constructores con parametros, por eso generalemente yo creo un metodo, en la clase derivada, que haga la construccion, asi controlo en el main yo mismo el orden en que se crean los singletons y le puedo pasar parametros.
singleton.h
--- Código: Text --- #if !defined(SINGLETON_DEC)#define SINGLETON_DEC //Clase CSingleton, base para derivar singletons template<class CLASS> class CSingleton{ protected: static CSingleton<CLASS>* m_poObj; public: CLASS* poObj() { if(!m_poObj) m_poObj=new CLASS(); return (CLASS*)m_poObj; }};template<class CLASS> CSingleton<CLASS>* CSingleton<CLASS>::m_poObj=new CLASS(); /* Esta funcion ahorra lineas de codigo, sirve para inicializar un puntero a alguna Clase derivada de CSingleton.*/template<class CLASS> CLASS* poSingleton(){ CLASS* poSingleObject=(CLASS*)0; poSingleObject=poSingleObject->poObj(); return poSingleObject;} #endif
main.cpp
--- Código: Text --- #include <iostream>#include "singleton.h" using namespace std; class A:public CSingleton<A>{ public: A(){cout<<"construyendo A"<<endl;} ~A(){cout<<"destruyendo A"<<endl;}}; class C{ public: C(){cout<<"construyendo C"<<endl;} ~C(){cout<<"destruyendo C"<<endl;}}; class B:public CSingleton<B>,public C{ public: B(){cout<<"construyendo B"<<endl;} ~B(){cout<<"destruyendo B"<<endl;}}; int main(){ A *p1=poSingleton<A>(); B *p2=poSingleton<B>(); delete p1; delete p2; return 0;}
Una alternativa interesante y a veces mejor(en mi opinion) son los namespaces. Son bastante comodos, ademas de que sus variables y metodos son "unicos", El unico problema es que se viola la encapsulacion, ademas de la imposibilidad de usar alguna clase base como se haria al construir un singleton derivado.
Navegación
[*] Página Anterior
Ir a la versión completa