Programación General > C/C++
Constructor Privado
nicokiki:
Hola a todos!!
Les planteo la siguiente duda. Si yo quisiera instanciar solo una "instancia" de una clase, tendria que implementar un constructor privado. El problema q tengo es q no se muy bien como hacerlo.
Si alguien me da una mano....
Salu2!!!!!!
CiRRuS:
Eso yo lo tuve que hacer para Java, a ver si lo adapto para C:
Debes declarar al contructor como privador y luego crear un método estático de la clase que al llamarlo cree la instancia de la clase, y si ya esta creada devuelva a ella misma.
--- Código: Text --- class A { private: A instancia=null; A(); public: static A getInstancia();}; A A::getInstancia() { if(instancia == null) return new A(); else return instancia;}
Espero haber realizado un código correcto... pero sobre todo que se vea clara la idea
¿Era eso lo que buscabas? ¿respondo a tu pregunta?
Nos vemos :hola:
nicokiki:
Gracias!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Eso era lo q necesitaba
Salu2!!!!!!
P.D.: Apoyen la solicitud de apertura del foro de JSP/Servlets!!!!!!!!!
Ruben3d:
--- Citar ---
--- Código: Text --- class A { private: A instancia=null; A(); public: static A getInstancia();}; A A::getInstancia() { if(instancia == null) return new A(); else return instancia;}
--- Fin de la cita ---
Francamente, me gustaría saber si alguno de vosotros ha compilado ese fragmento de código, porque según veo ha de dar errores de todo tipo por todas partes. Además, si consiguieras hacer eso funcionar generarías una nueva instancia en cada llamada a getInstancia().
Una forma correcta de hacer eso (que se llama singleton) y bastante probada es hacer esto:
--- Código: Text --- // En el fichero .hclass A{public: // Métodos que hagan falta // ... ~A() { /* código destructor */} // Retorna la única instancia de la clase static A *Instancia() {return &m_A;}; private: static A m_A; A() { /* código constructor */ }; // El constructor de copias tambien debe // ser privado A(const A &); // Otros miembros privados // ...}; // En el fichero .cpp // Para dar presencia física a la variable// estáticaA A::m_a; // Implementar aqui el resto de métodos de la clase
De esta forma, para acceder a la instancia se podría hacer esto en el código:
--- Código: Text --- A::Instancia()->método1(); o también A *pA = A::Instancia();pA->método1();pA->método2();
Hay que tener en cuenta que no hay que liberar los punteros, ya que apuntan a m_A, que será automáticamente liberado cuando sea llamado el destructor de la clase.
Esto tiene el problema del orden de inicialización si se llaman entre sí varias clases de este tipo en los constructores, pero se puede arreglar moviendo m_A al interior de Instancia() en forma de variable estática, por lo que será inicializado en la primera llamada a Instancia().
Creo que no he cometido ningún error en el código. Si no es así que alguien me lo diga.
Espero que esto te haya servido de ayuda.
Un saludo.
Ruben3D
CiRRuS:
--- Citar ---Francamente, me gustaría saber si alguno de vosotros ha compilado ese fragmento de código, porque según veo ha de dar errores de todo tipo por todas partes. Además, si consiguieras hacer eso funcionar generarías una nueva instancia en cada llamada a getInstancia().
--- Fin de la cita ---
Sorry :( , ya dije q no se si estaría libre de errores y q me basaba en una "idea" que tuve en Java...
No pretendia hacer código perfecto (más que nada porque no tenía mucho tiempo para terminar mi post...), solamente mostrar la idea... Aunque ese if ya veo que ta rotundamente mal, no tuve tiempo para verificar la correcion.
Me apunto tu singleton.
Nos vemos :hola:
Navegación
[#] Página Siguiente
Ir a la versión completa