如何解决循环依赖项在单个文件中编译,但不能在多个文件中编译
我想在多个文件中添加一个代码。它没有编译,所以我尽可能地简化了它,并将其合并到一个文件中。现在可以了。一些逻辑消失了。我需要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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。