使用不完整类型" struct学生"和前瞻性声明

时间:2018-06-05 07:55:49

标签: c++

编译时我的程序有问题。我试着弄清楚3-4个小时,但仍然没有找到解决方法。最后的结果是我想在多个.cpp文件中使用struct students而不会出现多个定义的错误..你能帮助我吗?这是代码:

student.h

#ifndef STUDENT
#define STUDENT
#include <string>
using namespace std;

extern int var;

struct students {
    char CodSt[20];
    string NumeSt;
    string PrenSt;
    string DenDisc1;
    string MedCD1;
    string DenDisc2;
    string MedCD2;
    string DenDisc3;
    string MedCD3;
};

#endif

getStudents.cpp

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int var = 0;

extern struct students *student;

void getStudents() {
    int i = 0;
    ifstream ifs("Curenta.txt");
    while(!ifs.eof()) {
        ifs >> student[i].CodSt >> student[i].NumeSt >> student[i].PrenSt >> student[i].DenDisc1
            >> student[i].MedCD1 >> student[i].DenDisc2 >> student[i].MedCD2 >> student[i].DenDisc3
            >> student[i].MedCD3;
        if(!ifs.eof()) {
            i++;
        }
        var = i;
    }
    ifs.close();
}

编译错误:

In function 'void getStudents()':
[Error] invalid use of incomplete type 'struct students'
[Error] forward declaration of 'struct students'

and same, so on..

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您想使用struct students,请将#include "student.h"文件存入.cpp文件。这样做会导致预编译器&#34;插入&#34;将头文件放入源代码文件中,从而提供struct的正确定义。

关于你的代码的一些附注(叫我迂腐,但如果你早点学习这些规则,它会长期帮助你):

  • 在命名方面保持一致。您的struct被命名为`学生&#39; (复数)但包含文件是&#39; student.h&#39; (单数)
  • 请勿在包含文件中使用using namespace ...。原因是:如果有人(即使你从现在开始一年,当你忘记了这个文件的实现细节)有一个不同的string类具有相似的语义但来自标准库?如果这样的用户包含students.h个文件,那么&#34;突然&#34;所有自定义string成为从标准库中提取的,确保有趣的调试日期:)
  • 目前尚不清楚为什么extern struct students * student;文件中会有.cpp行。这是一个错误,或者(如果没有)提供一个简短的评论来解释你为什么需要这一行是个好主意