问题描述
我想在多个文件中添加一个代码。它没有编译,所以我尽可能地简化了它,并将其合并到一个文件中。现在可以了。一些逻辑消失了。我需要Calculator
才能访问Creature
的功能(以获取统计信息)。我需要Mechanics
才能访问Calculator
函数,以计算来自其他Creature
的效果。编译以下代码:
struct Creature;
struct Calculator {
Creature* creature;
};
struct Mechanics {
Mechanics(Calculator* calculator);
};
Mechanics::Mechanics(Calculator* creature_collision_calculator) {}
struct Creature {
Creature(Calculator* calculator);
Mechanics mechanics;
};
Creature::Creature(Calculator* calculator) :
mechanics(calculator) {
}
int main() {
Calculator calculator;
Creature creature(&calculator);
}
但是,拆分为多个文件不是:
// calculator.h
#pragma once
#include "creature.h"
struct Creature;
struct Calculator {
Creature* creature;
};
// mechanics.h
#include "calculator.h"
struct Mechanics {
Mechanics(Calculator* calculator);
};
// mechanics.cpp
#include "mechanics.h"
Mechanics::Mechanics(Calculator* creature_collision_calculator) {}
// creature.h
#pragma once
#include "mechanics.h"
#include "calculator.h"
struct Creature {
Creature(Calculator* calculator);
Mechanics mechanics;
};
// creature.cpp
#pragma once
#include "creature.h"
struct Creature;
struct Calculator {
Creature* creature;
};
// main.cpp
#include "creature.h"
#include "calculator.h"
int main() {
Calculator calculator;
Creature creature(&calculator);
}
是否可以解决此问题?我使用Visual C ++编译器。我不想更改设计或将所有内容都保存在一个文件中。
解决方法
删除所有的通函#include
并仔细考虑:
- Calculator.h只需要知道生物存在,因此可以通过预先声明来解决。
- 类似地,Mechanics.h只需要预先声明Calculator。
- Creature.h需要一个
#include "mechanics.h"
,因为它需要知道Mechanics对象的大小。对于计算器,只需要预先声明即可。
我的习惯是#仅将一个文件包含到xyz.cpp
中(cpp很重要)。是xyz.h
。我一直将所有其他文件#include到xyz.h
。在C ++中,您无法调用不完整类型的函数,因此仅在xyz.h
中进行前向声明是不够的。关键是向前声明事物,以便在需要调用函数时xyz.h
中的函数声明(原型)进行编译并#include到xyz.cpp
。