我有班级,名为学生
class Student
{ string name;
unsigned long int ID ;
string email;
unsigned short int year;
public :
Student() // Constructor
string getName(void);
unsigned long int getID(void);
string getEmail(void);
unsigned short int getYear(void);
{
另一个名为 eClass
的类class eClass {
private:
string eclass_name;
Student* students[100];
unsigned int student_count;
public:
eClass(string name)
{
student_count =0 ;
eclass_name = name ;
}
bool exists(Student obj)
{
unsigned long int code = obj.getID();
bool flag = TRUE ;
for (unsigned int i = 0 ; i<=student_count ; i++ )
{
unsigned long int st = (*students[i]).getID();
if (code==st)
{
flag = FALSE;
}
}
return flag;
}
void add(Student& obj)
{
bool res = exists(obj);
if (res)
{
students[student_count] = new Student(); //probably the problem is here
*students[student_count] = obj ;
student_count++ ;
}
}
string getEclassName(void) { return eclass_name; }
unsigned int getStudentCount(void) { return student_count; }
Student getStudent(int i) { return *students[i-1]; }
};
声明学生*学生[100]; 必须与此完全相同。例如,我不能写这样的东西:学生*学生[100] = {};
main()看起来像这样
int main()
{
Student JohnDoe("John Doe", 12345, 2, "johndoe@gmail.gr");
eClass Cpp("C++");
Cpp.add(JohnDoe);
}
基本上我有一个指向Student对象的指针数组,每次我想添加一个新的Student对象时,我想动态分配内存。
当我编译时,我没有错误但是当我尝试运行程序时,我得到的唯一的东西是&#34; Program_name.exe&#34;停止了......
我很确定问题与内存分配有关,但我无法找到它并解决它。
有什么建议吗?
答案 0 :(得分:2)
exists
中的主要错误是使用未初始化的指针,循环太过分了。但是exists
通过值获取输入也是非常糟糕的风格。解决这两个问题:
bool exists(Student const& obj)
{
unsigned long int code = obj.getID();
bool flag = TRUE ;
for (unsigned int i = 0 ; i<student_count ; i++ )
{
unsigned long int st = (*students[i]).getID();
if (code==st)
{
flag = FALSE;
}
}
return flag;
}
您应该在学生中声明getID()
const,以便能够正确编码exists
。
unsigned long int getID() const;
答案 1 :(得分:0)
首先,您应该将所有学生指针初始化为NULL或nullprt。这不是严格需要的,但是进入是一个非常好的习惯。你以后会感谢自己。
第二,如果学生存在,你为什么要归还假?我有点困惑。此外,您可以在找到学生后使用break
语句;无需检查其余部分。
此外,在您的添加中,您可能需要检查以确保您没有超过100名学生。这会覆盖内存,会发生不好的事情。