Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有多个循环包含的名称空间_C++_Header_Namespaces_Include_Forward Declaration - Fatal编程技术网

C++ 具有多个循环包含的名称空间

C++ 具有多个循环包含的名称空间,c++,header,namespaces,include,forward-declaration,C++,Header,Namespaces,Include,Forward Declaration,我有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 /*******************************************************/ /

我有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.h
B.h
中包含
A.h
。仅实际执行
#在
B.cpp
C.cpp
中包含“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。