Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;指向另一个类的指针的动态数组_C++_Arrays_Pointers - Fatal编程技术网

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

C++ C++;指向另一个类的指针的动态数组,c++,arrays,pointers,C++,Arrays,Pointers,您好,我正在尝试创建一个指向对象学生的动态指针数组,该对象来自Grades类,但我不知道如何在标题中声明它 这是标题: class Grades { private: Student** array; int _numofStud; public: Grades(); Grades(const Grades& other); ~Grades(); 和等级构造函数(我不确定它是否正确) 我无法添加或修改此大小 我想把一个默认

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

这是标题:

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


public:


    Grades();
    Grades(const Grades& other);
    ~Grades();
和等级构造函数(我不确定它是否正确)

我无法添加或修改此大小

我想把一个默认的成绩大小放在一个数组中,数组中有两个指向学生对象的指针,我将定义为默认值,然后我将有一个其他方法,通过创建新学生并将他们的指针添加到数组中来添加新学生 问题是我不能改变数组的大小,我不明白为什么

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

编辑:

这是调试程序,您可以看到它何时创建新对象 它创建了一个5的数组,而不是2个 按照我的要求先填写2
剩下的3个我不知道为什么要创建它们,它们里面有什么好的,所以说清楚,在任何实际的程序中,你应该使用std::vector或其他容器,它们有很多我在这里忽略的特性(模板,支持移动语义,不需要默认构造函数等等),还有很多安全性(如果构造函数抛出异常怎么办?如果我执行
array.add(array[0])
?)怎么办?同时仍然针对通用用途进行了很好的优化

你也应该认真看看 STD::UnjyJPPT/<代码>,手册<代码>新< /COD>,Dele> <代码>,一般要求出现漏洞和其他错误,C++中几乎不需要任何资源的“自由”或“删除”。 <>也注意到,C++ +代码> SIEZYTUT 经常用于对象和容器的大小/长度。

因此,动态数组的基本思想是根据当前需求更改其大小,因此
Grades()
可以从空开始

Grades::Grades()
    : array(nullptr), _numofStud(0)
{}
然后,当添加一个新项目时,会创建一个新的较大数组,并复制所有现有项目(大致与
std::vector::push_back(x)
所做的相同)

无效分数::添加学生(学生*学生)
{
//做一个更大的数组
学生**新数组=新学生*;
//复制所有值
对于(int i=0;i<\u numostrud;++i)
newArray[i]=数组[i];//复制现有项
//新项目
newArray[\u numostrud]=学生;
++_努莫夫螺柱;
//摆脱旧阵列
删除[]数组;
//使用新数组
数组=新数组;
}

对于您的
数组
成员,使用
std::vector
会更好!相关的,我想不出在发布的代码中使用指针数组的原因。
std::vector
似乎更合适,并带来更接近兼容的额外好处。“在它进入构造器之前,它会给我创建一个大小为5的数组”:我不明白你的意思。你在说什么数组?还有“学生构造器中的5个元素”指的是什么?这些“元素”是什么“?您在这里的目的是了解动态大小的数据结构,例如
std::vector
实际上是如何工作的吗?您知道
Grades()
中所需的大小吗?还是希望像
addStudent(…)
可以多次调用的函数?这是一个学校项目,我们还没有学习到
std::vector
,所以我不确定我是否可以使用它,我所说的“进入构造函数之前”是不是当我定义
Student**array
时,它会自动创建一个大小为5的数组,我不知道如何修改这个大小Student中的5元素引用每个“this->”不需要像我那样私下声明数组头?
class Grades{private:Student**array;
是的,您需要标题中的内容,我使用了与您相同的两个变量(
array
\u numostrud
)。我使用了相同的addStudent函数,但问题是当我创建大小为[numostrud+1]的新数组时它正在为我创建一个大小为5的新数组,无论我为新学生*[[u numostrud+1]
设置了什么大小,它正在创建一个大小为5的数组,这是我无法理解的。我添加了一张调试的图片,这样你就可以看到我的意思,C/C++无法让用户从
新t[n]中确定“分配数组的大小”
,这就是您需要大小变量的原因。无论
\u numostrud+1
是什么(对于我的代码1、2、3等),都是有效的元素数。查看任何未定义的元素。
Student::Student(const char* name, char* id)
{
    this->_numofgrade = 0;
    this->setName(name);
    this->setId(id);
    this->_grades = NULL;
    this->_average = 0;
}
Grades::Grades()
    : array(nullptr), _numofStud(0)
{}
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;
}