在c++中,结构体没有更新其成员变量之一

A struct is not updating one of its member variables in c++

本文关键字:成员 变量 更新 c++ 结构体      更新时间:2023-10-16

我有一个结构体Creature和一个结构体Game。游戏是生物的"朋友"。在游戏中我有向量的生物;然后通过addC

函数将生物x添加到矢量中
void addc (Creature& c){
    creatures.push_back(c);
}

现在我在另一个函数foo中,它是结构体Game的公共方法。

void foo (Creature& c){
    ...
}

在这个函数中,我需要从向量生物中找到另一个生物与生物c的一些信息相匹配。所以我在Game中创建了另一个公共方法叫做fooHelper

void fooHelper (char s, int x, int y){
    bool found = false;
    for (int i = 0; i < creatures.size() && (!found); ++i){
        Creature& c = creatures[i];
        if (x == c.x && y == c.y){
            c.s = s;
            found = true;
        }
    }
}

然而,当我检查第二个生物的"s"成员是否正在更新时,结果是不是的!我不明白我做错了什么,因为我推了向量的引用。我正在从矢量中获取生物。

游戏中的矢量是这样的

struct Game{
    private:
        vector<Creature> creatures;
    ...
}
struct Creature{
    private:
        char s;
        int x; int y;
    ...
}

任何帮助都将非常感激!

语句:

creatures.push_back(c);

c副本存储到vector中:标准容器具有值语义。如果需要引用语义,应该将指针存储到vector对象中。

通常使用智能指针是个好主意,使用哪一个取决于你的应用程序的所有权策略。在这种情况下,根据我从你的问题的文本中得到的信息,让Game成为游戏中所有Creature s的唯一所有者似乎是合理的(因此唯一的对象是对拥有的Creature s的生命周期负责,特别是在它们不再需要时销毁它们),所以std::unique_ptr应该是一个不错的选择:

#include <memory> // For std::unique_ptr
struct Game{
private:
    std::vector<std::unique_ptr<Creature>> creatures;
    ...
};

成员函数addc()将变成:

void addc(std::unique_ptr<Creature> c)
{
    creatures.push_back(std::move(c));
}

客户端会这样调用它:

Game g;
// ...
std::unique_ptr<Creature> c(new Creature());
g.addc(std::move(c));
另一方面,您的foohelper()函数将被重写为如下内容:
void fooHelper (char s, int x, int y) {
    bool found = false;
    for (int i = 0; i < creatures.size() && (!found); ++i){
        std::unique_ptr<Creature>& c = creatures[i];
        if (x == c->x && y == c->y) {
            c->s = s;
            found = true;
        }
    }
}

最后,您的类Game可以返回非拥有的原始指针(或引用)给需要访问存储生物的客户端。

当你将你的生物参考推入矢量时,它正在复制。它是一个"生物"类型的向量,所以它从你给它的引用中复制了一个。一个解决方案是保留一个生物指示向量。

edit -这个问题比我所能解释的为什么不能有一个引用向量:为什么不能'