C++ C++;向数组中添加元素
这是我编程课作业的一部分。老师希望我们创建两个函数,其中一个将向现有的动态结构数组添加元素,这就是我遇到的问题 根据我在网上找到的不同帖子,以下是我对该功能应该如何工作的理解:C++ C++;向数组中添加元素,c++,arrays,dynamic,C++,Arrays,Dynamic,这是我编程课作业的一部分。老师希望我们创建两个函数,其中一个将向现有的动态结构数组添加元素,这就是我遇到的问题 根据我在网上找到的不同帖子,以下是我对该功能应该如何工作的理解: 创建一个比现有阵列大的新阵列 将旧数组的内容复制到新数组 将新元素添加到新数组中 销毁旧阵列 然而,有些地方出了问题,程序崩溃了——我认为问题在于我尝试执行第3点和第4点的方式。有人能看一下吗?我真的很感激任何帮助 编辑:忘了提到,老师希望函数设置为void,它们应该不会返回任何内容 代码如下: const int si
const int size = 2;
struct Player {
string name;
string kind;
};
void addplayer(Player * plarr, int size) {
cout << "Adding a new element to the array" << endl << endl;
//creating a new, bigger array:
Player * temp = NULL;
temp = new Player[size+1];
//copying the content of the old array
for (int i=0;i<size;i++) {
temp[i].name = plarr[i].name;
temp[i].kind = plarr[i].kind;
}
//adding the new element:
string name, kind;
cout << "Choose the name for the new player: " << endl;
cin >> name;
cout << "Choose the class for the new player: " << endl;
cin >> kind;
temp[size+1].name = name;
temp[size+1].kind = kind;
//deleting the old array, replacing it with the new one
delete[] plarr;
plarr = temp;
}
const int size=2;
结构播放器{
字符串名;
弦类;
};
void addplayer(播放器*plarr,整数大小){
库特
plarr
参数通过值传递给此函数
此函数用于分配新数组并正确复制内容,但有一个错误除外:
temp[size+1].name = name;
temp[size+1].kind = kind;
这里的索引应该是大小。但最大的错误是函数的结论是:
delete[] plarr;
plarr = temp;
}
不幸的是,由于plarr
是通过值传递的,因此所做的只是将此函数的plarr
参数设置为新指针,然后返回
它完全不起任何作用,因为这个函数的调用方仍然有它原来的指针。它现在被销毁了
您应该将此函数更改为返回
调用者需要保存的新指针,而不是原始指针
plarr
参数通过值传递给此函数
此函数用于分配新数组并正确复制内容,但有一个错误除外:
temp[size+1].name = name;
temp[size+1].kind = kind;
这里的索引应该是大小。但最大的错误是函数的结论是:
delete[] plarr;
plarr = temp;
}
不幸的是,由于值传递了plarr
参数,因此所有这些操作都将plarr
参数设置为新指针,并返回
它完全不起任何作用,因为这个函数的调用方仍然有它原来的指针。它现在被销毁了
您应该将此函数更改为返回
调用者需要保存的新指针,而不是原始指针。为什么不使用std::vector
-辛苦了!@EdHeal老师禁止了它,sadly@EdHeal:这对动态分配在引擎盖下的工作方式没有太大的指导意义,是吗?N如果你使用了<代码> > SiZeZt而不是<代码> int >代码>数组大小。它与C++的其他位更兼容。也可以看RAII。在这种情况下,你可以构建一个PraveReX数组类来在销毁时自动地管理和删除数组。为什么不使用<代码> STD::vector < /代码>-为你做了艰苦的工作!@EdHeal老师禁止了它,sadly@EdHeal对于动态分配在引擎盖下工作的指导意义不大,不是吗?但是如果你使用<代码> siZeZt而不是< C++ >代码> >数组大小,事情会比较容易。它与C++的其他位更兼容。。再看看RAII。在这种情况下,您可以构建一个Player_数组类来管理并在销毁时自动删除数组。遗憾的是,老师希望我们编写不返回任何内容的函数。换句话说,它们都应该具有void类型-抱歉,我可能应该在我的问题中提到这一点:(无论如何,非常感谢您的帮助!如果OP返回新指针的值,则调用必须变成plarr=newPlayer(plarr,size++);
。我个人会通过引用传递指针和大小,增加函数中的大小,因此声明为void newPlayer(Player*&plarr,size\u t&size)
。如果你不称职的老师想让你写糟糕的代码,你唯一的选择就是通过引用传递参数,而不是值。是的,通过引用传递成功了,非常感谢大家!遗憾的是,老师希望我们编写不返回任何内容的函数。换句话说,它们都应该是void type-对不起,我可能应该使用mentio在我的问题中:(非常感谢你的帮助!如果OP返回新指针的值,调用必须变成plarr=newPlayer(plarr,size++);
。我个人会通过引用传递指针和大小,在函数中增加大小,因此声明为void newPlayer(Player*&plarr,size\u t&size)
。如果你不称职的老师想让你写糟糕的代码,你唯一的选择就是通过引用传递参数,而不是值。是的,通过引用传递成功了,非常感谢大家!