在c++中,结构体没有更新其成员变量之一
A struct is not updating one of its member variables in c++
我有一个结构体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 -这个问题比我所能解释的为什么不能有一个引用向量:为什么不能'
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 成员变量与函数概念检查