循环依赖项在单个文件中编译,但不能在多个文件中编译

问题描述

我想在多个文件中添加一个代码。它没有编译,所以我尽可能地简化了它,并将其合并到一个文件中。现在可以了。一些逻辑消失了。我需要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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...