为什么我在 C++ 中将值插入 类 时出现 运行 时间错误

Why do I have a run-time Error inserting values into classes in C++

我需要一些帮助来解决这个问题。 我有一个名为 Grades 的 class,其中包含指向 class Student.

的指针
class Grades {
    int numofstuds;
    Student** studs;
public:
    void insertgrades();
    void printgrades();
};

class Student {
    int id;
    int grade;
public:
    void getId();
    void getGrade();
    void printgrade();
};

我正在尝试将学生插入阵列螺柱:

void Grades::insertgrades() {
    int i;
    cout << "How many students ?" << endl;
    cin >> numofstuds;
    studs = new Student*[numofstuds];
    for (i = 0; i < numofstuds; i++) {
        studs[i]->getId();
        studs[i]->getGrade();
    }
}

'insertgrades' 是 class Grades 中的内部函数。 getId 和 getGrade 是 class 'Student' 中的内部函数,它们运行良好我已经检查过它们:

void Student::getId() {
    do {
        cout << "Enter id" << endl;
        cin >> id;
    } while (id<0);
}
void Student::getGrade() {
    cout << "Enter grade:" << endl;
    cin >> grade;
}

这是主要的:

int main() {
    Grades a;
    a.insertgrades();
    return 0;
}

当我尝试将值插入 Id 或成绩时,我立即遇到了 运行 时间错误。 请帮忙! 伊桑.

您只创建了 "boxes" 来存储指向 Student 的指针,但您没有存储有效的指针。

您必须先创建学生才能使用。

void Grades::insertgrades() {
    int i;
    cout << "How many students ?" << endl;
    cin >> numofstuds;
    studs = new Student*[numofstuds];
    for (i = 0; i < numofstuds; i++) {
        studs[i] = new Student(); // add this line
        studs[i]->getId();
        studs[i]->getGrade();
    }
}

感谢您的及时回复! 感谢@MikeCAT,我已经解决了这个问题。 我添加了另一个函数来实际创建一个学生:

Student* createstud() {
    Student* News = new Student;
    return News;
}

然后我这样更改我的函数:

void Grades::insertgrades() {
    int i;
    cout << "How many students ?" << endl;
    cin >> numofstuds;
    studs = new Student*[numofstuds];
    for (i = 0; i < numofstuds; i++) {
        **studs[i] = createstud();**
        studs[i]->getId();
        studs[i]->getGrade();
    }
}

不确定为什么创建 Students** 数组是个坏主意,因为我计划在将来删除学生以便更容易更改数组内的指针,不是吗?

MikeCAT 的回答是正确的,但是请注意,您的操作很可能会导致内存泄漏。 显然我没有看到你的 class 析构函数 - 但是除非你仔细迭代 Studs 中的每个指针,调用 delete [],然后在 Studs 上调用 delete [] - 你最终会陷入一大堆泄漏的内存.

根据您使用的语言,我假设您更熟悉 VisualBasic 等引用计数语言 - 在 C++ 中,使用 New 分配内存并不能保证垃圾回收。 由于您没有存储 numberofstuds,您将永远无法释放 MikeCAT 的答案中分配的内存。

如果您可以使用 C++11,请考虑使用以下代码片段以内存安全的方式处理此问题。

#include <memory>
#include <vector>
class Student;
class Grades {
    int numofstuds;
    std::vector<std::shared_ptr<Student> > studs;
public:
    void insertgrades();
    void printgrades();
};

和插入成绩例程:

void Grades::insertgrades() {
    int i;
    std::cout << "How many students ?" << std::endl;
    std::cin >> numofstuds;
    studs.resize(numofstuds);
    for (auto Each_Student : studs) 
    {
        Each_Student.reset(new student())
        Each_Student->getId();
        Each_Student->getGrade();
    }
}

但是如果您必须使用原始指针(较旧的编译器,或较差的分级主体),请考虑以下析构函数MadCat 的回答

~Grades()
{
    for (i = 0; i < numofstuds; i++) 
    {
        delete studs[i];
    }
delete [] studs;
}

[/edit]

我想补充一点,您存储数据的方法并没有错误,但是您可以更简单地做到这一点。 与其创建一个指针数组来存储数据,不如分配一个对象数组。

class Grades 
{
    //snipped out everything else
    Student* studs;
}
void Grades::insertgrades() 
{
    int i;
    cout << "How many students ?" << endl;
    cin >> numofstuds;
    studs = new Student[numofstuds];
    for (i = 0; i < numofstuds; i++) {
        studs[i].getId();
        studs[i].getGrade();
    }
}

在 C++ 中,指针是 "The address in memory of data",数组是 "the address in memory of a set of data",因此下面的代码应该可以帮助您理解为什么上面的代码有效。

char A;
//the following pointer will *point to the location of A*
char * A_p = & A;
char Array[100];
//this pointer will *point to the data set Array*
char * Array_p = Array;
//this pointer *points to a newly allocated set of data*
char * B_p = new char [100];
//indeed, we can also do this 

//Set A to first character of array
A = *Array_p
A = Array_P[0]
A = *Array
A = Array[0]
//all of these do the same thing, as *when using an array, you're really using a pointer

delete [] B_P;