【问题标题】:C++ dynamic array of pointer to another classC++ 指向另一个类的指针的动态数组
【发布时间】:2019-12-17 09:56:55
【问题描述】:

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

这是标题:

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

问题在于,在它进入构造函数之前,它在Grades 中创建了一个大小为 5 的数组,因为我在 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 个我不知道为什么要创建它们以及它们里面有什么

【问题讨论】:

  • 您最好为您的array 成员使用std::vector&lt;Student&gt;
  • 相关,在发布的代码中我想不出你为什么要使用指针数组的原因根本std::vector&lt;Student&gt; 似乎更合适,并带来更接近RO3/5/0 兼容的额外好处。
  • 在它进入构造函数之前,它为我创建了一个大小为 5 的数组”:我不明白你的意思。你在说什么数组?还有“Student 构造函数中的 5 个元素”指的是什么?这些“元素”是什么?
  • 您是否打算在这里了解动态大小的数据结构(例如std::vector)实际上是如何工作的?你知道Grades() 需要的大小,还是想要像addStudent(...) 这样可以多次调用的函数?
  • 这是一个学校项目,我们还没有学习std::vector所以我不确定我可以使用它我所说的“在进入构造函数之前”是指当我定义@987654337 @它让我自动放置一个大小为 5 的数组,我不明白如何修改这个大小学生中的 5 元素引用每个“this->”

标签: c++ arrays pointers


【解决方案1】:

好的,所以要明确一点,在任何实际程序中你应该使用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;
}

【讨论】:

  • 不需要像我一样将数组声明为私有的标头吗? class Grades { private: Student** array;
  • 是的,您需要标题中的内容,我使用了与您相同的两个变量(array_numofStud)。
  • 我创建了相同的 addStudent 函数,但问题是当我创建大小为 [numofStud +1] 的 newArray 时,它正在为我创建一个大小为 5 的新数组,无论我为 @987654334 设置什么大小@it 正在创建一个大小为 5 的数组这就是我无法理解的
  • 我添加了调试图片,以便您了解我的意思
  • C/C++ 无法让用户从new T[n] 确定“已分配数组的大小”,这就是您需要大小变量的原因。无论_numofStud +1 是什么(对于我的代码1、2、3 等)都是有效 元素的数量。查看过去未定义的任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多