C ++结构指向对象类型错误的指针

时间:2016-12-08 21:29:24

标签: c++ structure

我遇到了C ++结构的问题。在我的下面的程序中,我试图从文件中读取考试的问题数量,考试答案以及学生考试答案的文件。这一切都有效,但是当我尝试将学生的信息放入结构的数组中时,变量id由于某种原因不起作用。编译器是Microsoft Visual Studio 2017 RC,它说“students-> id [i]”有一个错误,上面写着:“表达式必须有指向对象类型的指针”,我不知道为什么。我标记了问题所在并取消了剩下的代码,我所拥有的只是函数calculateGrade。我已经在这方面工作了一段时间,如果不解决这个问题就无法实现。任何帮助表示赞赏!

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
struct studentInfo {
    int id;
    string firstName;
    string lastName;
    string exam;
};
double calculateGrade(struct studentInfo);
int main() {
    const int SIZE = 12;
    studentInfo students[SIZE];
    string fileName, key, studentFile;
    ifstream file, fileForStudents;
    int numOfQuestions, i = 0, id;

    cout << "Please enter a file name: ";
    cin >> fileName;

    file.open(fileName);
    if (!file.is_open()) {
        cout << "Could not open file";
    }

    file >> numOfQuestions >> key >> studentFile;

    fileForStudents.open(studentFile);
    if (!fileForStudents.is_open()) {
        cout << "Could not open file";
    }

    while (!fileForStudents.eof()) {

        fileForStudents >> id >> students->firstName[i] >> students->lastName[i] >> students->exam[i];

        students->id[i] = id; //issue is here

        i++;
    }

    calculateGrade(students[SIZE]);


    return 0;
}

2 个答案:

答案 0 :(得分:2)

你只是把索引放错了地方 - 它应该是students[i].firstName而不是students->firstName[i]等等,因为students是数组。

此行也不正确:

calculateGrade(students[SIZE]);

它可能会编译,但你会有超出界限访问的UB。如果您需要传递整个数组,则将指针传递给第一个元素和大小,但最好使用std::vectorstd::array并通过引用传递它。

所以对于其他问题,为什么这样的代码:

 students->firstName[i]

编译,首先students是一个C样式数组,它可以隐式衰减到指向第一个元素的指针,因此students->firstName等于students[0].firstName然后students->firstName[i]等于students[0].firstName[i]将从字符串中访问第i个符号。

因此使用std::vector还有另一个原因 - 您的表达式students->firstName[i]无法编译,也不会提供错误表达,表明此类代码是正确的。

答案 1 :(得分:2)

students->id只是一个int,它不是数组,因此您无法使用students->id[i]

数组为students,因此它应为students[i].id。您不使用->,因为students是一个结构数组,而不是一个指针数组。