gpt4 book ai didi

C++ 指向另一个类的动态指针数组

转载 作者:行者123 更新时间:2023-12-03 07:01:06 25 4
gpt4 key购买 nike

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

这是标题:

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 个指向我将定义为默认的学生对象的指针的数组,然后我将使用其他方法来添加新的 Students,方法是创建它们并将它们的指针添加到数组问题是我不能改变数组的大小,我不明白为什么

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

编辑: enter image description here

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

最佳答案

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

而且你也真的应该看看std::unique_ptr,手动newdelete,一般都是求leaking等错误,在 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;
}

关于C++ 指向另一个类的动态指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59371658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com