【发布时间】:2014-11-08 23:44:33
【问题描述】:
我有一个“类”类,它有一个字符串名称和一个“学生”对象数组。 “学生”类有一个名字和“成绩”。 “成绩”类是一个双精度数组。
在主类中,我创建了一个 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)。”
如果有这个异常的处理程序,程序可以安全地继续。 是因为对象太多,每个对象都是另一个对象的成员吗?有没有办法“删除”我在此行之前创建的“测试”和“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”学生数组没有在构造函数中实例化吗?
【问题讨论】:
-
为什么不
Class testClass("Comp Sci 1", 3);?除此之外,您必须显示更多代码才能找出问题所在。 -
您似乎混淆了堆栈和堆实例化。现在,由于您分配它们的方式,您正在导致不必要的复制操作。
-
另外,当您确定学生人数为 100 时,为什么还要通过学生人数?改为使用向量,并且只拥有您需要的尽可能多的学生。这样学生就不会在堆上被放入堆栈,这可能是你得到溢出的原因。
-
您所做的创建了一个类,然后将其复制到 testClass,这是不必要的。但是您的实施策略还有其他问题。
-
谢谢@ddriver。这行得通。我肯定会在 C++ 中查看更多的堆栈分配和堆分配。我不能使用矢量,因为我的老师不允许。否则,我肯定会使用它。
标签: c++ class stack-overflow