Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 循环依赖项在单个文件中编译,但在多个文件中编译时不会';T_C++_Linker_Linker Errors_Circular Dependency_Forward Declaration - Fatal编程技术网

C++ 循环依赖项在单个文件中编译,但在多个文件中编译时不会';T

C++ 循环依赖项在单个文件中编译,但在多个文件中编译时不会';T,c++,linker,linker-errors,circular-dependency,forward-declaration,C++,Linker,Linker Errors,Circular Dependency,Forward Declaration,我想在多个文件中有一个代码。它没有编译,所以我尽可能地简化它,并将其合并到一个文件中。现在是了。有些逻辑已经不存在了。我需要计算器来访问生物的功能(获取统计数据)。我需要Mechanics访问Calculator函数来计算其他生物的效果。编译以下代码: struct生物; 结构计算器{ 生物*生物; }; 结构力学{ 力学(计算器*计算器); }; 力学:力学(计算器*生物碰撞计算器){} 结构生物{ 生物(计算器*计算器); 力学; }; 生物::生物(计算器*计算器): 力学(计算器){ }

我想在多个文件中有一个代码。它没有编译,所以我尽可能地简化它,并将其合并到一个文件中。现在是了。有些逻辑已经不存在了。我需要
计算器
来访问
生物
的功能(获取统计数据)。我需要
Mechanics
访问
Calculator
函数来计算其他
生物的效果。编译以下代码:

struct生物;
结构计算器{
生物*生物;
};
结构力学{
力学(计算器*计算器);
};
力学:力学(计算器*生物碰撞计算器){}
结构生物{
生物(计算器*计算器);
力学;
};
生物::生物(计算器*计算器):
力学(计算器){
}
int main(){
计算器;
生物(计算器);
}
但是,如果将其拆分为多个文件,则不会:

//calculator.h
#布拉格语一次
#包括“生物.h”
结构生物;
结构计算器{
生物*生物;
};
//mechanics.h
#包括“calculator.h”
结构力学{
力学(计算器*计算器);
};
//mechanics.cpp
#包括“mechanics.h”
力学:力学(计算器*生物碰撞计算器){}
//bioter.h
#布拉格语一次
#包括“mechanics.h”
#包括“calculator.h”
结构生物{
生物(计算器*计算器);
力学;
};
//bioture.cpp
#布拉格语一次
#包括“生物.h”
结构生物;
结构计算器{
生物*生物;
};
//main.cpp
#包括“生物.h”
#包括“calculator.h”
int main(){
计算器;
生物(计算器);
}

有办法解决这个问题吗?我使用Visual C++编译器。我不想更改设计或将所有内容都放在一个文件中。

删除所有循环
#包括
并仔细考虑:

  • Calculator.h只需要知道该生物存在,就可以通过预先声明获得
  • 类似地,Mechanics.h只需要一个预先的计算器
  • 生物.h需要一个
    #包括“mechanics.h”
    ,因为它需要知道力学对象的大小。对于计算器,它只需要有一个预声明

我有一个习惯,只将一个文件包含到
xyz.cpp
(cpp很重要)。它是
xyz.h
。我一直保存的所有其他文件,包括to
xyz.h
。在C++中,你不能调用不完整类型的函数,因此只在代码> XYZ。关键是转发声明,以便在需要调用函数时,
xyz.h
中函数的声明(原型)可以编译并#include到
xyz.cpp

只需从header中删除冗余include即可。最好的方法是从代码中删除循环依赖项。