7

C ++で相互再帰クラスを実装するにはどうすればよいですか?何かのようなもの:

/*
 * 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_ */
4

4 に答える 4

7
  1. クラスを前方宣言します(クラスの1つだけを前方宣言することで回避できますが、適切な形式の場合は両方を実行します)。
  2. 前方宣言-メソッドを宣言します(同上)。
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();
  //...
}
于 2010-08-04T23:42:10.297 に答える
4

前方宣言を使用します。

class Class2;

class Class1
{
  Class2* Class2_ptr;
};

class Class2 
{
  Class1* Class1_ptr;
}

Class1のメソッドはClass2の実際の定義に依存するため、前方宣言のみからメソッドを使用することはできないため、メソッド定義はClass2宣言の後に発生する必要があります。

一方、この種の密結合は通常、設計が悪いことを示しています。

于 2010-08-04T23:30:36.023 に答える
1

たとえば、クラスの1つを事前に宣言しますClass2

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

class Class2
{
     // ...
}  
于 2010-08-04T23:31:16.827 に答える
1

上部のクラスの1つ(または両方)を前方宣言します。例:

class Class2;
class Class1 { ... };

両方のクラスが定義された後(つまり、アウトオブライン)にメソッドを定義します。

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();
      //...
}
于 2010-08-04T23:31:49.853 に答える