c++ 多文件 多个类互相使用,如何决绝头文件互相依赖的问题
时间: 2023-12-06 17:04:23 浏览: 353
在 C++ 中,解决头文件互相依赖的问题可以通过前向声明和分离接口和实现两种方式。
一、前向声明
前向声明是指在头文件中声明一个类而不包含它的定义。这样,在其他文件包含该头文件时,就可以通过类的指针或引用使用该类,而不需要包含该类的定义。
例如,假设有两个类 A 和 B,它们互相依赖。可以在 A 的头文件中声明类 B,而不包含 B 的定义:
```c++
// A.h
class B; // 前向声明
class A {
public:
A();
void foo(B* b);
};
```
然后在 A.cpp 文件中包含 B 的头文件,并实现 A 的成员函数:
```c++
// A.cpp
#include "A.h"
#include "B.h"
A::A() {}
void A::foo(B* b) {
// 使用 B 类型指针
}
```
同样,也可以在 B 的头文件中声明类 A:
```c++
// B.h
class A; // 前向声明
class B {
public:
B();
void bar(A* a);
};
```
然后在 B.cpp 文件中包含 A 的头文件,并实现 B 的成员函数:
```c++
// B.cpp
#include "B.h"
#include "A.h"
B::B() {}
void B::bar(A* a) {
// 使用 A 类型指针
}
```
二、分离接口和实现
另一种解决头文件互相依赖的方法是将接口和实现分离到不同的文件中。接口包含类的声明和定义,而实现只包含类的成员函数的实现。
例如,假设有两个类 A 和 B,它们互相依赖。可以将它们的接口和实现分别放到不同的文件中:
A.h:
```c++
// A.h
class B; // 前向声明
class A {
public:
A();
void foo(B* b);
private:
int a;
};
```
A.cpp:
```c++
// A.cpp
#include "A.h"
#include "B.h"
A::A() {}
void A::foo(B* b) {
// 使用 B 类型指针
}
```
B.h:
```c++
// B.h
class A; // 前向声明
class B {
public:
B();
void bar(A* a);
private:
int b;
};
```
B.cpp:
```c++
// B.cpp
#include "B.h"
#include "A.h"
B::B() {}
void B::bar(A* a) {
// 使用 A 类型指针
}
```
这样,如果其他文件需要使用 A 或 B 类的接口,只需要包含相应的头文件即可。如果需要使用 A 或 B 类的实现,只需要链接相应的实现文件即可。
阅读全文