实例化新类时出现c++错误

c++ error when instantiating a new Class

本文关键字:c++ 错误 新类时 实例化      更新时间:2023-10-16

我有一个"class"类,它有一个字符串名称和一个"Student"对象数组。"学生"类有一个名称,并有"成绩"。"Grades"类是一组替身。

在主类中,我创建了一个Grades对象和一个Student对象。我用它测试了一些功能,一切都很好:

int main(){
    cout << fixed << setprecision(2);
    Grades test = Grades ("5 - 90.0 85.0 95.5 77.5 88.0");
    cout << test.toString() << endl;
    cout << "nSum  = " << test.getSum() << endl;
    cout << "Num grades  = " << test.getNumGrades() << endl;
    cout << "Low grade  = " << test.getLowGrade() << endl;
    cout << "High grade  = " << test.getHighGrade() << endl;
    Student stu = Student("Billy Bob", "5 - 90 85 95.5 77.5 88");
    cout << stu.toString() << endl;
    cout << "nSum  = " << stu.getSum() << endl;
    cout << "Average  = " << stu.getAverage() << endl;
    cout << "Average after dropping low grade  = " << stu.getAverageMinusLow() << endl;
    cout << "Low grade  = " << stu.getLowGrade() << endl;
    cout << "High grade  = " << stu.getHighGrade() << endl;
}

然而,当我添加行时:

Class testClass = Class("Comp Sci 1", 3);

然后运行程序,它会出现堆栈溢出错误。"Gradebook.exe中0x0033EAB7处的首次机会异常:0xC00000FD:堆栈溢出(参数:0x00000000,0x003D2000)。"

如果存在此异常的处理程序,则程序可以安全地继续运行。是不是因为对象太多,每个对象都是另一个对象的成员?有没有办法"删除"我的"测试"answers"stu"对象,这些对象是在这行之前创建的?

以下是我的"类"构造函数供参考:

class Class{
    private:
        string name;
        Student studentList[100];
        int numStudents;
    public: Class(string className, int numStudents1);
            Class();
}
Class:: Class(string className, int numStudents1){
    name = className;
    numStudents = numStudents1;
}
Class:: Class(){
    name = "";
    numStudents = 0;
}

出现此错误是因为Class对象中的"studentList"Student数组没有在构造函数中实例化吗?

函数中声明的每个变量都位于堆栈上,函数外声明的变量都是静态变量,并使用数据段。

Class testClass("Comp Sci 1", 3);
int main(){

这在某些方面也很糟糕,但并没有引起堆叠式气流那么严重。

那个设计显然是错误的。

你应该在Student中有一个向量或类似的容器来容纳所有年级,在Class中应该有一个类似的容器,来容纳所有学生。你说你的老师不允许你使用vector,这对你的水平没有多大意义,但也许他希望你创建自己的容器类?再说一遍,你似乎还没有完全做到这一点,所以这是一种悖论。

你的问题是,你在一个班里为100名学生分配了足够的存储空间,而这100名学生可能有很多成绩,所以这个班可能会变得很大,太大了,无法放在堆栈上,这就是它溢出的原因。这样,班级加上学生加上成绩,就形成了一大块"扁平"记忆。当您在没有编译器优化的情况下使用这种形式的实例化Class testClass = Class(...)时,它不会创建一个而是创建两个对象,只是将后者分配给前者。修复类构造函数(你也应该修复另一个)可能会解决溢出问题,但它不能解决你的设计问题。

在内存中使用Class这样的大型结构要简单得多,并且推荐良好的做法。将其扁平化实际上更复杂,但可能具有其他优势(如性能或内存效率),并且与动态分配一起使用仍然是安全的,但在您的情况下,您对一流的效率不感兴趣,而是对理解感兴趣,因此具有良好的设计。

此外,正如评论中提到的,创建一个有成绩的学生是错误的,尤其是将成绩作为字符串文字传递。如果这是一个你必须在实践中使用的真正的程序,如果成绩还没有出来,你将如何在年初培养出所有成绩的新生?Student类构造函数应该只传递学生的名称,而应该具有addGrade()成员函数。

那么Class对象预分配一个长度为100的静态数组呢?如果你只有3个学生,那么就浪费了97个学生的记忆。如果你需要100多名学生怎么办?您的程序崩溃。这就是为什么你应该使用一个容器,并且只有你需要的那么多学生。我只能假设同样可怕的事情正在学生班里发生。这些类型的"技术"通常用于旧的C代码,这可能是你的老师所困扰的,但肯定不建议用于教授现代C++。