Mutually recursive classes

怎甘沉沦 提交于 2019-11-27 09:17:49
  1. Forward-declare the classes (you could get away with forward-declaring only one of them, but for good form do both).
  2. Forward-declare the methods (ditto).
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();
  //...
}

Use forward declaration.

class Class2;

class Class1
{
  Class2* Class2_ptr;
};

class Class2 
{
  Class1* Class1_ptr;
}

Because the methods in Class1 will depend on the actual definition of Class2, method definitions must occur after the Class2 declaration, since you can't use methods from only a forward declaration.

On the other hand, this kind of tight coupling is usually indicative of bad design.

Predeclare one of the classes, for example 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 one of the classes (or both) on the top, eg.:

class Class2;
class Class1 { ... };

and define the methods after both of the classes are defined (that is, out-of-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();
      //...
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!