7
votes

Classes mutuellement récursives

Comment puis-je mettre en œuvre des classes mutuellement récursives en C ++? Quelque chose comme: xxx


2 commentaires

Avez-vous une objection à l'opérateur -> ?


En fait je fais. Mon chemin est plus simple pour moi.


4 Réponses :


4
votes

Utilisez la déclaration à terme.

class Class2;

class Class1
{
  Class2* Class2_ptr;
};

class Class2 
{
  Class1* Class1_ptr;
}


0 commentaires

1
votes

Prédeclare l'une des classes, par exemple CLASS2 CODE>

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

class Class2
{
     // ...
}  


0 commentaires

1
votes

avancement déclarer l'une des classes (ou les deux) sur le dessus, par exemple.:

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();
      //...
}


1 commentaires

Que veux-tu dire? Comment pouvez-vous définir les classes sans définir les méthodes?



7
votes
  1. Forward-déclare les classes (vous pourriez vous échapper avec l'un d'entre eux, mais pour une forme de bonne forme). Li>
  2. Avertissement - Déclarez les méthodes (Ditto). Li>
    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();
      //...
    }
    

2 commentaires

Vous oubliez de mettre la déclaration à terme, mais cette réponse a toujours le code qui est le plus clair pour moi.


@drenami: ack! Désolé, je l'avais dans mon code de test, mais goofed dans la coupe et la pâte. Je le réparerai...