• Viernes 8 de Noviembre de 2024, 19:57

Autor Tema:  Método que actue sobre objetos de la misma clase  (Leído 1081 veces)

josean86

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Método que actue sobre objetos de la misma clase
« en: Miércoles 23 de Junio de 2010, 15:10 »
0
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++
  1.  
  2. class Base{
  3.  
  4.     private:
  5.     int k;
  6.  
  7.     public:
  8.     Base(int kk){
  9.         k = kk;
  10.     }
  11.     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
  12.         k = k*i;
  13.     }
  14. };
  15.  
  16. int main(){
  17.     Base a(1), b(2), c(3);
  18.     //Los valores "k" de a, b y c son 1, 2 y 3
  19.     Base::actualizar(4);
  20.     //Los valores de "k" me gustaria que se cambiasen directamente a 4, 8 y 12
  21.     return 0;
  22. }
  23.  
  24.  

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

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Método que actue sobre objetos de la misma clase
« Respuesta #1 en: Jueves 24 de Junio de 2010, 02:32 »
0
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
  1.  
  2. #include <stdio.h>
  3. #include <set>
  4. #include <algorithm>
  5.  
  6. class ClaseInteresante
  7. {
  8. public:
  9.     ClaseInteresante(int unValor = 0) : valor(unValor)
  10.     {
  11.         printf("Creando: %pn", this);
  12.         mInstancias.insert(this);
  13.     };
  14.  
  15.     ClaseInteresante(const ClaseInteresante& c)
  16.     {
  17.         printf("Creando copia: %pn", this);
  18.         valor = c.valor;
  19.         mInstancias.insert(this);
  20.     };
  21.  
  22.     ~ClaseInteresante()
  23.     {
  24.         printf("Destruyendo: %pn", this);
  25.         mInstancias.erase(this);
  26.     };
  27.  
  28.     template<class F>
  29.     static void aplicarEnTodos(F f)
  30.     {
  31.         std::for_each(mInstancias.begin() ,mInstancias.end() ,f);
  32.     }
  33.  
  34.     int getValor()
  35.     {
  36.         return valor;
  37.     };
  38.  
  39. private:
  40.     int valor;
  41.     static std::set<ClaseInteresante*> mInstancias;
  42. };
  43.  
  44. std::set<ClaseInteresante*> ClaseInteresante::mInstancias;
  45.  
  46. struct ClaseImpresora
  47. {
  48.     void operator()(ClaseInteresante* i)
  49.     {
  50.         if (i)
  51.         {
  52.             printf("Objeto: %p, Valor: %dn", i , i->getValor());
  53.         }
  54.     };
  55. };
  56.  
  57. void main()
  58. {
  59.     ClaseInteresante a(1), b(2), c(3);
  60.     ClaseInteresante d(c);
  61.     ClaseInteresante e(c);
  62.    
  63.     ClaseImpresora i;
  64.     printf("nAplicando funcion a todas las instancias:n");
  65.     ClaseInteresante::aplicarEnTodos(i);
  66.     printf("n");
  67. }
  68.  
  69.  

josean86

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Método que actue sobre objetos de la misma clase
« Respuesta #2 en: Jueves 24 de Junio de 2010, 09:12 »
0
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