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 合 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 回答