在不同文件中的函数定义内的Struct参数

时间:2014-02-05 17:43:39

标签: c++ file struct visual-studio-2013

我有一项任务,我必须为我的功能使用不同的文件,而且我不必使用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相同

希望你能帮助我!如果您需要更多详细信息,请索取。

2 个答案:

答案 0 :(得分:0)

您应该在使用之前转发声明类和结构。在功能之前添加struct Elemento;。无论如何,如果不将ifstream包括在某个地方,你就无法使用ifstream

答案 1 :(得分:0)

必须首先在使用它的语句之上声明翻译单元中使用的每个名称。例如,您的函数Registro使用名称Elemento。编译器不知道它,因此您必须首先在某处声明它以指定其类型。这同样适用于ifstreamofstream。此外,我认为您正在尝试将Menu.cpp与其他文件中的所有函数定义相关联。然后你就麻烦了,因为每个函数有多个定义,includeMenu.cpp中有一个定义,而在每个源文件中有另一个定义。链接所有这些时,每个函数都会得到两个定义。另外,请注意这是一个糟糕的设计。您永远不应该include .cpp个文件。那是NOT,因为你不被允许。预处理器不关心您是include .cpp还是.abcdef文件。它们都只是文本文件。有了这个,我的意思是你不应该在你的翻译单元中加入definitions,因为它们可能会让你头疼,这是你不能指望的非常糟糕的设计。以下是如何组织代码的一个很好的解释。希望这有帮助!

要添加的内容:

我看到了你的评论。是的,Element在main.cpp中是defined(未声明)。但是,因为您正在单独编译所有这些文件,所以编译器不知道您指定它的翻译单元unless之外存在什么。因此,如果您在使用之前没有Element,它就不会知道名称declare。我认为你对一些概念的理解很少:翻译单元,预处理包括-s,链接,范围,存储持续时间等。花点时间阅读它,以便一切都变得更加清晰。

How to successfuly organize your source code in files.