Question

Comment implémenter des classes mutuellement récursives en C ++? Quelque chose comme:

/*
 * 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_ */
Était-ce utile?

La solution

  1. Forward-déclarer les classes (vous pouvez vous en sortir avec l'avant-déclarant que l'un d'entre eux, mais pour une bonne forme à la fois faire).
  2. Forward-déclarer les méthodes (idem).
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();
  //...
}

Autres conseils

Utilisez déclaration avant.

class Class2;

class Class1
{
  Class2* Class2_ptr;
};

class Class2 
{
  Class1* Class1_ptr;
}

Parce que les méthodes Class1 dépendra de la définition réelle de Classe2, les définitions de méthode doivent se produire après la déclaration de Classe2, puisque vous ne pouvez pas utiliser des méthodes à partir de seulement une déclaration en avant.

D'autre part, ce type de couplage étroit est généralement un indice de mauvaise conception.

prédéclarer une des classes, par exemple 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 déclarer l'une des classes (ou les deux) sur le dessus, par exemple:.

class Class2;
class Class1 { ... };

et de définir les méthodes après les deux classes sont définies (à savoir, hors ligne):

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();
      //...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top