gpt4 book ai didi

c++ - 具有多重循环包含的命名空间

转载 作者:行者123 更新时间:2023-11-30 03:53:37 25 4
gpt4 key购买 nike

我有 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 header guards 停止,这就是为什么我在 A::someMethod(args) 中收到“不完整类型‘class B’”错误。

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

如何使此代码与单独的头文件一起使用?

最佳答案

正确的方法是使用 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

关于c++ - 具有多重循环包含的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30041664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com