【问题标题】:Namespaces with multiple cyclic inclusion具有多个循环包含的命名空间
【发布时间】:2015-07-14 12:28:14
【问题描述】:

我有 3 个属于命名空间“MyNS”的类。 “A”使用“B”和“C”,而“B”和“C”都使用“A”。这是我的标题的结构:

//mynamespace.h
#ifndef SOMENAMESPACE_H
#define SOMENAMESPACE_H
namespace MyNS {
     class A;
     class B;
     class C;
}
#endif
/*******************************************************/
//A.h
#ifndef A_H
#define A_H

#include "mynamespace.h"
#include "B.h"
#include "C.h"

class MyNS::A {
    ..
    MyNS::B someMethod(args);
    MyNS::C someMethod2(args);
    ..
};
#endif
/*******************************************************/
//B.h
#ifndef B_H
#define B_H

#include "mynamespace.h"
#include "A.h"

class MyNS::B {
    ..
    MyNS::A *someMember;
    ..
};
#endif
/*******************************************************/
//C.h
#ifndef C_H
#define C_H

#include "mynamespace.h"
#include "A.h"

class MyNS::C {
    ..
    MyNS::A *someMember;
    ..
};
#endif

每个类都有一个包含以下行的 C++ 源文件:

using namespace MyNS;

编译器被 B.h 标头保护停止,这就是我在 A::someMethod(args) 中收到“不完整类型 'class B'”错误的原因。

我知道我可以在“mynamespace.h”中包含所有类定义,但是这些类很长,这使我的头文件变得臃肿,这就是为什么我不得不像这样将它们分开。

如何使这段代码与单独的头文件一起工作?

【问题讨论】:

  • 你有什么问题?
  • 如何让这段代码正常工作。

标签: c++ header namespaces include forward-declaration


【解决方案1】:

正确的做法是使用forward declaration。不要在C.hB.h 中包含A.h。仅在B.cppC.cpp 中实际执行#include "A.h"。命名空间中的前向声明应该足够了。

//mynamespace.h
#ifndef SOMENAMESPACE_H
#define SOMENAMESPACE_H
namespace MyNS {
     class A;
     class B;
     class C;
}
#endif
/*******************************************************/
//A.h
#ifndef A_H
#define A_H

#include "mynamespace.h"
#include "B.h"
#include "C.h"

class MyNS::A {
    ..
    MyNS::B someMethod(args);
    MyNS::C someMethod2(args);
    ..
};
#endif
/*******************************************************/
//B.h
#ifndef B_H
#define B_H

#include "mynamespace.h"

class MyNS::B {
    ..
    MyNS::A *someMember;
    ..
};
#endif
/*******************************************************/
//C.h
#ifndef C_H
#define C_H

#include "mynamespace.h"

class MyNS::C {
    ..
    MyNS::A *someMember;
    ..
};
#endif

【讨论】:

  • 函数定义在哪里?在 cpp 文件中定义函数。 cpp 文件将执行包含。
  • 我还稍微编辑了我的答案,以便您可以在 A.h 中实际使用 B 和 C,但不能在 B.h 和 C.h 中使用 A。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多