【发布时间】:2021-08-12 16:53:32
【问题描述】:
如何在 C++ 中实现通过引用将结构实例附加到数组的函数?这样在将存储在变量中的结构附加到数组后,可以进一步使用该变量来更改数组的实例。
伪代码:
struct St{
int x
}
St* arr;
St a = {0};
append a to arr;
a.x = 1;
//expecting arr[0].x = 1
这是带有电影示例的 C++ 代码(请参阅描述问题的 cmets):
struct Film{
int id;
char* name;
};
void add_film(Film *&films, int &size, Film &film){
if (size == 0)
films = new Film[1];
else
{
Film *tmp = new Film[size + 1];
for (int i = 0; i < size; ++i)
{
tmp[i] = films[i];
}
delete[]films;
films = tmp;
}
films[size] = film;
film = films[size]; //how to reassign passed film object to a new object in array?
size++;
}
int main(){
Film *films = nullptr;
int size = 0;
Film film = {1, "Name1"};
add_film(films, size, film);
film.name = "Name2";
std::cout << films[0].name; //output: "Name1", expected: "Name2"
}
【问题讨论】:
-
首先,不要使用
new/delete,而是使用标准类,例如std::vector在你的情况下。其次,为什么不反过来呢? IE。首先追加/分配对象到列表,然后获取它的引用? -
这对于给定的类型是不可能的。可以接近的方法是使用一组电影指针(或更好的
std::unique_ptr<Film>s),这将允许您返回对新Film对象的引用,即使数组增长,该对象也保持不变。我强烈建议创建一个class/struct来管理电影数据,但这将是处理释放内存的常用方法;请注意,最后分配的数组永远不会被您的代码释放,如果您计划在单个程序中使用多个电影列表(关键字内存泄漏),这是一件坏事 -
@fabian 可以,使用
std::reference_wrapper,但通常不需要。
标签: c++ arrays function pass-by-reference