c++ - 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 我不知道为什么要创建它们以及它们里面有什么
解决方案
好的,所以要明确一点,在您应该使用的任何实际程序std::vector
或其他容器中,它们有很多我在这里忽略的功能(作为模板、支持移动语义、不需要默认构造函数等),很多安全性(如果构造函数抛出异常怎么办?如果我这样做怎么办array.add(array[0])
?),同时仍然针对通用用途进行了很好的优化。
而且您还应该真正查看std::unique_ptr
,手动new
,delete
通常是要求泄漏和其他错误,在 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;
}
推荐阅读
- sql - oracle sql中的to_timestamp未处理空值
- c - 在中序树遍历中将节点推送到堆栈而不是它们的值
- selenium - Kotlin、Cucumber 和 Selenium - Kotlin 无法与元素交互
- laravel - Laravel 批量邮件队列(按数量和时间划分)
- c++ - 如何按升序对输入文件中的数字进行排序,并找到它们的范围和中位数?
- r - 变量的打印输出
- java - 当我尝试将一个对象添加到一个 ArrayList 中时,它会添加哈希码,不知道如何解决。初学者
- python - struct.error: unpack_from 需要至少 4 个字节的缓冲区
- r - 在选择中使用多个条件(dplyr)
- forms - SilverStripe 3 UserForms - 未发送或未接收的电子邮件。如何解决问题