gpt4 book ai didi

带有条件编译的c++ header 包含顺序

转载 作者:行者123 更新时间:2023-11-28 02:45:36 27 4
gpt4 key购买 nike

假设我有两个文件 A.hpp 和 B.hpp

A.hpp:

#indef DEF_A
#define DEF_A

class A{
/*implementation of class A*/
/*some part of it needs B*/
#ifdef DEF_B
void method(B b){/*do something with B*/}
#endif
}
#endif

B.hpp:

#indef DEF_B
#define DEF_B

class B{
/*implementation of class B*/
/*some part of it needs A*/
#ifdef DEF_A
void method(A a){/*do something with A*/}
#endif
}
#endif

我不想将 A.hpp 包含在 B.hpp 中(反之亦然),因为每次我需要 A.hpp 时我都需要 B.hpp(或反之亦然)。

但是在我写的主文件中:

主要.cpp

#include"A.hpp"
#include"B.hpp"

int main(){
A a;
B b;
}

A::method(B b) 未知。如果我颠倒包含顺序,我将只有 B::method(A a)

当包含两个 header 时,有没有办法访问这两种方法?

[编辑]该方法也适用于没有 .cpp 文件的模板类。[/编辑]

最佳答案

我会使用前向声明,例如:

A.hpp

#indef DEF_A
#define DEF_A

class B; // Forward declaration of B

class A { // Definition of A
public:
void method(const B& b);
};
#endif

A.cpp

#include "A.hpp"
#include "B.hpp"

void A::method(const B& b) { /* your implementation */ }

B.hpp

#indef DEF_B
#define DEF_B

class A; // Forward declaration of A

class B { // Definition of B
public:
void method(const A& a);
};
#endif

B.cpp

#include "B.hpp"
#include "A.hpp"

void B::method(const A& a) { /* your implementation */ }

然后在ma​​in.cpp你同时使用了 A.hppB.hpp 。但是如果在 C.cpp 中你只使用 A(没有 B)你可以做

C.cpp

#include "A.hpp"

void foo()
{
A a;
// B b; // If uncommented, that would fail to compile.
}

关于带有条件编译的c++ header 包含顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24546912/

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