前言

之前的模块化是编译成.lib。在单文件下还好,多文件下还是有点问题。


正文

1
2
3
4
5
6
#pragma once
#include"Weapon.h"
class Hack{
public:
class Weapon;
};
1
2
3
4
5
6
7
8
#pragma once
#include"Hack.h"

class Hack::Weapon{
public:
int hp;
int mp;
};
1
2
3
4
5
6
7
8
9
10
#include<iostream>
#include"Hack.h"
#include"Weapon.h"

int main(){

Hack::Weapon hw;

return 0;
}

发现编译器提示使用一个不完整的类。

但是当他们都写在.cpp源文件的时候反而不报错。

显然是头文件之间出现了问题。因为两个头文件相互引用,而预编译阶段就是展开头文件。
所以当互相调用的时候,就不能确定先展开谁,因为无论先展开谁,都会有一个缺失了,导致类不完整。

当追究主次的时候,我们知道,Hack肯定先声明,Weapon可以后声明,也就是说Hack.h不是必要引用Weapon.h的。
谁想用就让谁引用,这里自然是.cpp源文件要引用。
所以修改Hack.h头文件

1
2
3
4
5
6
#pragma once

class Hack{
public:
class Weapon;
};

回头看声明是合法的。没有报错了。

就跟先有鸡还是先有蛋相似。。都是逻辑问题。没什么好硬扯的。


结语

聪明的大宝贝还能用#ifdef之类的去判重。