我有一个struct Creature和一个struct game。游戏是Creature的“朋友”。 在游戏中我有 矢量生物; 然后我将一个生物x添加到该矢量中,这个函数叫做addC
void addc (Creature& c){
creatures.push_back(c);
}
现在我在另一个函数“foo”中,它是struct Game的公共方法。
void foo (Creature& c){
...
}
在那个功能中,我需要从矢量生物中找到另一个生物 匹配来自Creature 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;
...
}
任何帮助都会非常感激!
答案 0 :(得分:2)
本声明:
creatures.push_back(c);
将c
的副本存储到您的向量中:标准容器具有值语义。如果需要引用语义,则应将指针存储到向量中。
通常使用智能指针是个好主意,使用哪一个取决于应用程序的所有权政策。在这种情况下,基于我可以从您的问题文本中获得的信息,让Game
成为游戏中所有Creature
的唯一所有者似乎是合理的(因此唯一的对象是< em>负责所拥有的Creature
的生命周期,特别是在不再需要它们时销毁它们,所以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
可以向需要访问已存储生物的客户返回非拥有原始指针(或引用)。
答案 1 :(得分:1)
当你将生物引用推入向量时,它正在制作副本。它是“生物”类型的向量,因此它会从您提供的引用中复制它。一种解决方案是保持生物指针的向量。
编辑 - 这个问题有助于解释比我能够更好地解释为什么你没有参考文献的东西:Why can't I make a vector of references?