包容性问题

时间:2010-08-04 21:36:21

标签: c++ namespaces include g++ include-guards

我有一个包含模式如下:

/*
 * 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'没有命名类型。”

这个错误是由我的包含物的排序引起的吗?

有哪些可能的解决方案?我对前瞻性声明解决我的问题持怀疑态度。

2 个答案:

答案 0 :(得分: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;
    };

}

打破相互包容。

答案 1 :(得分:0)

在class1.h中,尝试删除class2.h中不必要的循环#include。如果需要循环依赖 - 或者即使不是 - 请考虑使用前向声明。