Pergunta

Como implemento classes mutuamente recursivas no 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_ */
Foi útil?

Solução

  1. De acordo com as classes (você pode se dar bem com apenas uma delas apenas uma delas, mas, para uma boa forma, faça as duas coisas).
  2. Avançar os métodos (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();
  //...
}

Outras dicas

Use a declaração avançada.

class Class2;

class Class1
{
  Class2* Class2_ptr;
};

class Class2 
{
  Class1* Class1_ptr;
}

Como os métodos na Classe1 dependerão da definição real de classe2, as definições de método devem ocorrer após a declaração da Classe2, pois você não pode usar métodos de apenas uma declaração direta.

Por outro lado, esse tipo de acoplamento apertado é geralmente indicativo de design ruim.

Predeclare uma das classes, por exemplo 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 uma das classes (ou ambas) no topo, por exemplo:

class Class2;
class Class1 { ... };

e definir os métodos depois que as duas classes são definidas (ou seja, fora da linha):

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top