【问题标题】:Returning a reference to object from vector从向量返回对对象的引用
【发布时间】:2023-01-04 23:00:12
【问题描述】:

我是一个完全的 C++ 初学者,所以所有的概念对我来说都是全新的。手头的问题是我有一个向量,它由诸如

vector<Item> inventory { item1, item2, item3 };

我通过引用将它传递给一个函数,然后需要将它传递给另一个函数以检索具有我需要的 itemId 的对象

Item& returnItem(vector<Item> &vec, int id) {
    for(Item &i : vec) {
        if(i.getItemId() == id) {
            return i;
        }
    }

void f(vector<Item> &vec, int id) {
    Item foundItem = returnItem(vec, id);
}

我有另一个需要将此对象传递给的函数,但显然它没有按预期工作,因为在运行 returnItem 函数后使用 foundItem.setItemId() 不会更改向量内的任何内容。

有什么简单的方法可以解决这个问题,或者更好的方法是什么?

【问题讨论】:

  • returnItem 返回一个引用,但是当您使用 Item foundItem = returnItem(...) 时,您实际上得到了一个副本。要获得参考,您需要Item &amp; foundItem = returnItem(...)
  • 请发一个minimal reproducible example-setItemId,我想你需要Item&amp; foundItem = returnItem(vec, id);,否则foundItemi的副本;
  • 定义“未按预期工作”。 minimal reproducible example 会很有用。

标签: c++ vector


【解决方案1】:

没有完整的Minimal, Reproducible Example,很难确定问题出在哪里。

但是 - 我的猜测是原因是这一行:

Item foundItem = returnItem(vec, id);

returnItem 返回一个引用,但是对foundItem 的赋值实际上创建了一个副本(因为foundItem 的类型是Item不是参考Item)。

要修复它,请将其更改为:

//---V---------------------------------
Item & foundItem = returnItem(vec, id);

现在foundItem 将引用vector 中的项目,修改它会更改vector 中的项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多