Frage

Wie implementiere ich gegenseitig rekursive Klassen in C ++? Etwas wie:

/*
 * 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_ */
War es hilfreich?

Lösung

  1. Forward-Declare in den Klassen (Sie könnten mit der Vorwärtsdeklarierung nur eines davonkommen, aber für eine gute Form beides).
  2. Forward-Declare the Methods (dito).
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();
  //...
}

Andere Tipps

Verwenden Sie die Vorwärtsklaration.

class Class2;

class Class1
{
  Class2* Class2_ptr;
};

class Class2 
{
  Class1* Class1_ptr;
}

Da die Methoden in Klasse1 von der tatsächlichen Definition von Klasse2 abhängen, müssen Methodendefinitionen nach der Klasse2 -Deklaration auftreten, da Sie keine Methoden aus einer Vorwärtsdeklaration verwenden können.

Andererseits weist diese Art der engen Kupplung normalerweise auf ein schlechtes Design hin.

Vorhanden Sie beispielsweise eine der Klassen 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 Declare eine der Klassen (oder beides) oben, z. B.:

class Class2;
class Class1 { ... };

und definieren Sie die Methoden, nachdem beide Klassen definiert wurden (dh außerhalb der Line):

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();
      //...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top