我有一项任务,我必须为我的功能使用不同的文件,而且我不必使用Header文件。问题是编译器向我显示了各种错误。所有错误都与我的所有功能完全相同。
这是错误:
1> ------构建开始:项目:Asignacion 1,配置:调试Win32 ------
1> SortCompany.cpp
1> c:\ users \ emanuel \ documents \ visual studio 2013 \ projects \ asignacion 1 \ asignacion 1 \ sortcompany.cpp(1):error C2065:' Elemento' :未声明的标识符
1> c:\ users \ emanuel \ documents \ visual studio 2013 \ projects \ asignacion 1 \ asignacion 1 \ sortcompany.cpp(1):错误C2146:语法错误:缺少')'在标识符'经销商'
之前1> c:\ users \ emanuel \ documents \ visual studio 2013 \ projects \ asignacion 1 \ asignacion 1 \ sortcompany.cpp(1):error C2182:' SortCompany' :非法使用类型' void'
1> c:\ users \ emanuel \ documents \ visual studio 2013 \ projects \ asignacion 1 \ asignacion 1 \ sortcompany.cpp(1):error C2059:语法错误:')'
1> c:\ users \ emanuel \ documents \ visual studio 2013 \ projects \ asignacion 1 \ asignacion 1 \ sortcompany.cpp(2):错误C2143:语法错误:缺少&#39 ;;'之前' {'
1> c:\ users \ emanuel \ documents \ visual studio 2013 \ projects \ asignacion 1 \ asignacion 1 \ sortcompany.cpp(2):error C2447:' {' :缺少函数头(旧式正式列表?)
(与所有文件相同的错误.....)
1>生成代码...... ==========构建:0成功,1个失败,0个最新,0个跳过==========
我有main.cpp,它是主文件(显然)。主要电话" Menu.cpp"菜单调用其他文件中的所有其他功能。
PD:Elemento []是一个结构
Menu.cpp代码:
using namespace std;
//these functions are fine
void Closing(ifstream &, ofstream &);
void Opening(ifstream &, ofstream &);
//the problem is here with all these functions
void Registro(Elemento[], int &, ifstream &);
void InfoDealer(Elemento[], int, ofstream &);
void SortCompany(Elemento[], int);
void MayorVentas(Elemento[], int, ofstream &);
void MayorVentasPorMarca(Elemento[], int, ofstream &);
#include "Registro.cpp"
#include "InfoDealer.cpp"
#include "SortCompany.cpp"
#include "MayorVentas.cpp"
#include "MayorVentasPorMarca.cpp"
void Menu()
{
//code here...
}
Registro.cpp:
void Registro(Elemento Dealer[], int &Cantidad, ifstream &entrada)
{
//code here...
}
main.cpp:(此文件是默认文件。我不应该更改它。)
//include stuff
using namespace std;
const int MAXIMODEALERS = 20;
const int MAXIMOMODELOS = 6;
struct Detail
{
string ModelName;
int Sales;
};
typedef Detail Detalle;
struct Element
{
string CompanyName;
Detalle Modelo[MAXIMOMODELOS];
};
typedef Element Elemento;
Elemento Dealer[MAXIMODEALERS];
int Cantidad;
void Menu(void);
#include "Menu.cpp"
void Opening(ifstream &Entrada, ofstream &Salida)
{
//code
}
void Closing(ifstream &entrada, ofstream &salida)
{
//code
}
int main()
{
Menu();
return 0;
}
所有剩余文件的结构与Registro.cpp相同
希望你能帮助我!如果您需要更多详细信息,请索取。答案 0 :(得分:0)
您应该在使用之前转发声明类和结构。在功能之前添加struct Elemento;
。无论如何,如果不将ifstream
包括在某个地方,你就无法使用ifstream
。
答案 1 :(得分:0)
必须首先在使用它的语句之上声明翻译单元中使用的每个名称。例如,您的函数Registro
使用名称Elemento
。编译器不知道它,因此您必须首先在某处声明它以指定其类型。这同样适用于ifstream
和ofstream
。此外,我认为您正在尝试将Menu.cpp
与其他文件中的所有函数定义相关联。然后你就麻烦了,因为每个函数有多个定义,include
在Menu.cpp
中有一个定义,而在每个源文件中有另一个定义。链接所有这些时,每个函数都会得到两个定义。另外,请注意这是一个糟糕的设计。您永远不应该include
.cpp
个文件。那是NOT
,因为你不被允许。预处理器不关心您是include
.cpp
还是.abcdef
文件。它们都只是文本文件。有了这个,我的意思是你不应该在你的翻译单元中加入definitions
,因为它们可能会让你头疼,这是你不能指望的非常糟糕的设计。以下是如何组织代码的一个很好的解释。希望这有帮助!
要添加的内容:
我看到了你的评论。是的,Element
在main.cpp中是defined
(未声明)。但是,因为您正在单独编译所有这些文件,所以编译器不知道您指定它的翻译单元unless
之外存在什么。因此,如果您在使用之前没有Element
,它就不会知道名称declare
。我认为你对一些概念的理解很少:翻译单元,预处理包括-s,链接,范围,存储持续时间等。花点时间阅读它,以便一切都变得更加清晰。