【问题标题】:Circular dependency compiles in a single file but in multiple it doesn't循环依赖在单个文件中编译,但在多个文件中不编译
【发布时间】:2020-12-26 23:31:32
【问题描述】:

我想在多个文件中有一个代码。它没有编译,所以我尽可能地简化它并将它合并到一个文件中。现在确实如此。有些逻辑已经消失了。我需要Calculator 才能访问Creature 的功能(以获取统计信息)。我需要Mechanics 才能访问Calculator 函数来计算来自其他Creatures 的影响。以下代码编译:

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++ 编译器。我不想更改设计或将所有内容都放在一个文件中。

【问题讨论】:

  • 只需从标题中删除多余的包含
  • 最好的方法是从代码中移除循环依赖。

标签: c++ linker linker-errors circular-dependency forward-declaration


【解决方案1】:

删除所有通知#includes并仔细考虑:

  • Calculator.h 只需要知道 Creature 存在,因此可以通过预先声明。
  • 同样,Mechanics.h 只需要预先声明 Calculator。
  • Creature.h 需要#include "mechanics.h",因为它需要知道 Mechanics 对象的大小。对于计算器,只需要预先声明即可。

【讨论】:

    【解决方案2】:

    我有一个习惯:#include 一个文件到xyz.cpp(cpp 很重要)。它是xyz.h。我总是#include 到xyz.h 的所有其他文件。在 C++ 中,您不能调用不完整类型的函数,因此仅在 xyz.h 中进行前向声明是不够的。关键是转发声明的东西,以便在需要调用函数时xyz.h 中的函数的声明(原型)编译和#include 到xyz.cpp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多