Pregunta

¿Cómo implemento clases recursivas mutuamente en C ++? Algo como:

/*
 * Recursion.h
 *
 */

#ifndef RECURSION_H_
#define RECURSION_H_

class Class1
{
  Class2* Class2_ptr;
public:
  void Class1_method()
  {
      //...
      (*Class2_ptr).Class2_method();
      //...
  }
};

class Class2
{
    Class1* Class1_ptr;
public:
    void Class2_method()
    {
        //...
        (*Class1_ptr).Class1_method();
        //...
    };
};


#endif /* RECURSION_H_ */
¿Fue útil?

Solución

  1. Declaración delantera Las clases (podría salirse con la suya con la decisión delantera solo una de ellas, pero para una buena forma haz ambas cosas).
  2. Declaración directa Los métodos (ídem).
class Class1;
class Class2;

class Class1
{
  Class2* Class2_ptr;
public:
  void Class1_method();
};

class Class2
{
  Class1* Class1_ptr;
public:
  void Class2_method();
};

void Class1::Class1_method()
{
  //...
  (*Class2_ptr).Class2_method();
  //...
}

void Class2::Class2_method()
{
  //...
  (*Class1_ptr).Class1_method();
  //...
}

Otros consejos

Use la declaración de avance.

class Class2;

class Class1
{
  Class2* Class2_ptr;
};

class Class2 
{
  Class1* Class1_ptr;
}

Debido a que los métodos en la clase1 dependerán de la definición real de clase2, las definiciones de métodos deben ocurrir después de la declaración de clase2, ya que no puede usar métodos de solo una declaración directa.

Por otro lado, este tipo de acoplamiento apretado suele ser indicativo de un mal diseño.

Predeclare una de las clases, por ejemplo Class2

#ifndef RECURSION_H_
#define RECURSION_H_
class Class2;
class Class1
{
   Class2* Class2_ptr;
   public:
   void Class1_method()
   {
      //...
      (*Class2_ptr).Class2_method();
      //...
   }
};

class Class2
{
     // ...
}  

Forward declara una de las clases (o ambas) en la parte superior, por ejemplo:

class Class2;
class Class1 { ... };

y definir los métodos después de que se definan ambas clases (es decir, fuera de línea):

class Class1
{
 ...
 void Class1_method(); // just declare
 ...
};

class Class2
{
 ...
};

// once definition of Class2 is known, we can define the method of Class1
void Class1::Class1_method()
{
      //...
      (*Class2_ptr).Class2_method();
      //...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top