Programación General > C/C++
Método que actue sobre objetos de la misma clase
(1/1)
josean86:
Hola,
me preguntaba si seria posible algo defnir un metodo en una clase para que dicho metodo actuase en todos los objetos de la misma clase (sin tener que aplicarlo uno a uno). Lo que busco seria algo así:
--- Código: C++ --- class Base{ private: int k; public: Base(int kk){ k = kk; } static void actualizar( int i){ //Esta función está mal definida porque utiliza elementos que no son estáticos, pero precisamente busco alguna manera de hacer una función que afecte a todos los objetos de la clase directamente y que haga variar elementos nos estaticos k = k*i; }}; int main(){ Base a(1), b(2), c(3); //Los valores "k" de a, b y c son 1, 2 y 3 Base::actualizar(4); //Los valores de "k" me gustaria que se cambiasen directamente a 4, 8 y 12 return 0;}
He probado varias maneras de hacerlo con funciones static, y también usando las signal y slots de biblioteca Qt, pero ni con esas he conseguido hacerlo
¿Alguna idea?
Gracias
Amilius:
Sería interesante saber si esto se puede hacer sin mantener una lista de punteros a todas las instancias creadas.
Este código implementa una clase que permite aplicar una función a todas sus instancias. Use un conjunto en lugar de una lista o vector para tener complejidad logaritmica al agregar y eliminar elementos. En todo caso no deberían existir elementos repetidos. ^_^
--- Código: Text --- #include <stdio.h>#include <set>#include <algorithm> class ClaseInteresante{public: ClaseInteresante(int unValor = 0) : valor(unValor) { printf("Creando: %pn", this); mInstancias.insert(this); }; ClaseInteresante(const ClaseInteresante& c) { printf("Creando copia: %pn", this); valor = c.valor; mInstancias.insert(this); }; ~ClaseInteresante() { printf("Destruyendo: %pn", this); mInstancias.erase(this); }; template<class F> static void aplicarEnTodos(F f) { std::for_each(mInstancias.begin() ,mInstancias.end() ,f); } int getValor() { return valor; }; private: int valor; static std::set<ClaseInteresante*> mInstancias;}; std::set<ClaseInteresante*> ClaseInteresante::mInstancias; struct ClaseImpresora{ void operator()(ClaseInteresante* i) { if (i) { printf("Objeto: %p, Valor: %dn", i , i->getValor()); } };}; void main(){ ClaseInteresante a(1), b(2), c(3); ClaseInteresante d(c); ClaseInteresante e(c); ClaseImpresora i; printf("nAplicando funcion a todas las instancias:n"); ClaseInteresante::aplicarEnTodos(i); printf("n");}
josean86:
Gracias por contestar Amilius,
me parece interesante la forma de actuar que tiene la función aplicarEnTodos que has escrito.
Pero de todas maneras lo que busco es la manera de, como tu dices, no tener que almacenar los objetos creados para tener que aplicarles la función. Es decir, que cada objetoInteresante tuviese una propiedad que cumpliese que, por el hecho de pertenecer a la claseInteresante, al aplicar una función determinada se aplicase a todos los objetos de la clase.
Un saludo y gracias
Navegación
Ir a la versión completa