首页 > 解决方案 > C++ 指向另一个类的指针的动态数组

问题描述

Student您好,我正在尝试从类创建一个指向对象的动态指针数组,Grades但我不知道如何在标题中声明它

那是标题:

class Grades
        {
private:
    Student** array;
    int _numofStud;


public:


    Grades();
    Grades(const Grades& other);
    ~Grades();

和成绩构造函数(我不确定它是否正确)

Grades::Grades()
{
    this->array = new Student * [2];
    for (int i = 0; i < 2; ++i)
    {
        this->array[i] = NULL;
    }
    this->array[0]= new Student("auto1", "12345");
    this->array[1]= new Student("auto2", "67890");
    this->_numofStud = 2;
} 

问题是,在它进入构造函数之前,它为我创建了一个大小为 5 的数组,Grades因为我在 Student 构造函数中有 5 个元素

Student::Student(const char* name, char* id)
{
    this->_numofgrade = 0;
    this->setName(name);
    this->setId(id);
    this->_grades = NULL;
    this->_average = 0;
}

我不能添加或修改这个尺寸

我想将默认大小的 Grades 放入一个包含 2 个指向学生对象的指针的数组中,我将其定义为默认值,然后我将使用其他方法通过创建新学生并将它们的指针添加到数组来添加新学生。问题是我无法更改数组的大小,我不明白为什么

我希望我的解释很清楚谢谢你的帮助

编辑: 在此处输入图像描述

那是调试器,您可以看到它何时创建一个新对象 Grades g1 它正在创建一个由 5 组成的数组,而不是按照我的要求先填充 2,而剩下的 3 我不知道为什么要创建它们以及它们里面有什么

标签: c++arrayspointers

解决方案


好的,所以要明确一点,在您应该使用的任何实际程序std::vector或其他容器中,它们有很多我在这里忽略的功能(作为模板、支持移动语义、不需要默认构造函数等),很多安全性(如果构造函数抛出异常怎么办?如果我这样做怎么办array.add(array[0])?),同时仍然针对通用用途进行了很好的优化。

而且您还应该真正查看std::unique_ptr,手动newdelete通常是要求泄漏和其他错误,在 C++ 中,几乎不需要手动“释放”或“删除”任何资源。

另请注意,C++size_t中通常用于对象和容器的大小/长度。

所以动态数组的基本思想是它根据当前需求改变它的大小,所以Grades()例如可以从空开始。

Grades::Grades()
    : array(nullptr), _numofStud(0)
{}

然后在添加新项目时,会创建一个更大的新数组,并复制所有现有项目(大致是什么std::vector::push_back(x))。

void Grades::addStudent(Student *student)
{
    // make a larger array
    Student **newArray = new Student*[_numofStud + 1];
    // copy all the values
    for (int i = 0; i < _numofStud; ++i)
        newArray[i] = array[i]; // copy existing item
    // new item
    newArray[_numofStud] = student;
    ++_numofStud;
    // get rid of old array
    delete[] array;
    // use new array
    array = newArray;
}

推荐阅读