C++ 动态内存分配到指向对象的指针数组
我有一个名为学生的班C++ 动态内存分配到指向对象的指针数组,c++,pointers,object,dynamic,C++,Pointers,Object,Dynamic,我有一个名为学生的班 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
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]; }
};
基本上,我有一个指向学生对象的指针数组,每次我想添加一个新的学生对象时,我都要动态分配内存
当我编译时,我没有得到任何错误,但当我试图运行程序时,我得到的唯一结果是“program_name.exe”停止运行
我很确定这个问题与内存分配有关,但我无法找到它并解决它
有什么建议吗 首先,您应该初始化所有指向NULL或nullprt的学生指针。这不是严格需要的,但却是一个很好的习惯。你以后会感谢你自己的 第二,如果学生存在,为什么返回false?我觉得有点困惑。此外,在您发现您的学生存在后,您可以使用
break
语句;不需要检查其余的
此外,在您的add上,您可能需要检查以确保您的学生不超过100人。这将覆盖内存,并会发生不好的事情。存在
中的主要错误是循环使用未初始化的指针走得太远。但是,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;
}
从我所看到的,上面的代码看起来不错;您可以发布Student
的实现吗?为什么要使用指向Student
s的指针?只需存储Student
s。根据您发布的内容,我估计主要的bug存在于中(Student obj)
。无论如何,您不应该将值传递给该函数(但我认为这不是主要的bug)。将exists
的实现添加到您的帖子中。主要嫌疑犯是exists
。(旁注:exists
如果学生不存在,返回true
是非常违反直觉的。)我编辑并添加了学生类和exist函数。。。使用指针不是我的选择……我们的教授让我们这样做注意使用student\u count
来控制student
的使用。因此,如果正确使用了student\u count
,则无需初始化student
,并且当student\u count
使用错误时,初始化student
将不会有帮助。@JSF添加了一个关于这一点的解释。我知道这是不必要的,但这是一个很好的习惯,尽早开始。总是初始化一切;指针、INT、类、对话等等……如果我发表评论时你的第二句话在那里,我就不会发表评论了。但第一句中的“需要”一词仍然是错误的(与第二句相矛盾)。“应该”或“应该”将涵盖它。正如你所评论的,我正在改变它。我想我已经消除了第一个需要。让我明白。哇…非常感谢我的朋友…我从来没有想到再多做一次循环会造成这么大的问题!!!
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;
}
unsigned long int getID() const;