3

次のような包含パターンがあります。

/*
 * Class1.h
 */

#ifndef CLASS1_H_
#define CLASS1_H_

#include "Class2.h"

namespace Class1_namespace
{

class Class1
{
  Class2* Class2_ptr;
  void Class1_member()
  {
      (*Class2_ptr).Class2_method();
  }
};

}

#endif /* CLASS1_H_ */

/*
 * Class2.h
 */

#ifndef CLASS2_H_
#define CLASS2_H_

#include "Class1.h"

class Class2
{
    Class1_namespace::Class1 Class2_data;

public:
    void Class2_method(){};
};

#endif /* CLASS2_H_ */

/*
 * main.cpp
 */

#include "Class1.h"

int main()
{
    return 0;
}

ただし、これにより、「'Class1_namespace' はタイプに名前を付けていません。」というエラーが発生します。</p>

このエラーはインクルージョンの順序が原因ですか?

考えられる解決策は何ですか?私の問題を解決する前方宣言については疑わしいです。

4

2 に答える 2

2

Class1 に Class2 を含める必要はありません。

相互依存関係がある場合 (2 in 1 を含めることはできません)、通常は、包含の代わりに前方宣言を使用して解決できます。

たとえば、Class1 が次のようになっているとします。

#include "Class2.h"

namespace Class1_namespace
{

    class Class1
    {
        Class2* class2;
    };

}

インクルードが必要だと思われる場合は、代わりに次のようにすることができます。

class Class2;

namespace Class1_namespace
{

    class Class1
    {
        Class2* class2;
    };

}

相互包摂を破るために。

于 2010-08-04T21:38:31.650 に答える
0

class1.h で、class2.h の不要で循環的な #include を削除してみてください。循環依存が必要な場合、またはそうでない場合でも、前方宣言の使用を検討してください。

于 2010-08-04T21:40:40.757 に答える