【问题标题】:Dynamic memory allocation to array of pointers to object对象指针数组的动态内存分配
【发布时间】:2015-12-10 15:03:39
【问题描述】:

我有一个名为Student班级

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]; }


     };    

语句 Student* students[100]; 必须看起来完全像这样。例如我不能这样写: Student* students[100]={} ;

而 main() 看起来像这样

    int main()
   {
     Student    JohnDoe("John Doe", 12345,  2,  "johndoe@gmail.gr");
     eClass Cpp("C++"); 
     Cpp.add(JohnDoe);


     }

基本上我有一个指向 Student 对象的指针数组,我想在每次添加新的 Student 对象时动态分配内存。

编译时我没有收到任何错误,但是当我尝试运行程序时,我得到的唯一结果是“Program_name.exe”停止运行...

我很确定问题与内存分配有关,但我无法找到并解决它。

有什么建议吗?

【问题讨论】:

  • 据我所见,上面的代码看起来不错;你能发布Student的实现吗?
  • 你为什么使用指向Students的指针?只需存储Students。
  • 根据您发布的内容,我估计主要错误在exists(Student obj)。无论如何,您不应该将值传递给该函数(但我不认为 that 是主要错误)。将exists 的实现添加到您的帖子中。
  • 主要嫌疑人是exists。 (旁注:exists 如果学生不存在 则返回true 非常违反直觉。)
  • 我编辑并添加了 Student 类和存在函数...使用指针不是我的选择...我们的教授要求我们这样做

标签: c++ pointers object dynamic


【解决方案1】:

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;
}

您应该在 student 内部声明 getID() const 以便能够正确编码 exists

unsigned long int getID() const;

【讨论】:

  • 哇...非常感谢我的朋友...我从没想过再一个循环会造成这么大的问题!!!
【解决方案2】:

首先,您应该将所有学生指针初始化为 NULL 或 nullprt。这不是严格需要的,但这是一个非常好的习惯。以后你会感谢自己的。

其次,如果学生存在,为什么要返回 false?我想象的有点混乱。此外,您可以在发现您的学生存在后使用break 语句;无需检查其余部分。

此外,在添加时,您可能需要检查以确保您的学生人数不超过 100 人。这会覆盖内存并且会发生不好的事情。

【讨论】:

  • 注意使用student_count来控制students的使用。因此,如果student_count 使用正确,则无需初始化students,而当student_count 使用不正确时,初始化students 将无济于事。
  • @JSF 对此添加了解释。我知道这不是必需的,但尽早进入这是一个好习惯。始终初始化一切;指针、整数、类、对话等......
  • 如果我评论时你的第二句话在那儿,我就不会评论了。 但是第一句中的“需要”一词仍然是错误的(与第二句相矛盾)。 “应该”或“应该”会覆盖它。
  • 正如您评论的那样,我正在更改它。我以为我已经消除了第一个需求。让我明白。
猜你喜欢
  • 2013-10-04
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 2016-02-03
  • 2012-11-06
  • 2012-05-04
相关资源
最近更新 更多