问题描述
所以我有一个结构体,它保存游戏中实体的变量(命中点、x 和 y 坐标等),并且我在全局范围内声明了该结构体。但是,我在“设置”函数中创建了实例,并希望在单独的“逻辑”函数中修改它们的变量。但显然,由于实例是“setup”函数的本地实例,“logic”函数不能修改它们的变量。
这是我当前代码的简化。
return FutureBuilder(
future: FirebaseAuth.instance.currentUser,builder: (ctx,futureSnapshot) => ListView.builder(
reverse: true,// So that 1st message goes to last.
itemCount: chatDocument.length,itemBuilder: (ctx,index) => MessageBubble(
message: chatDocument[index]['text'],isMe: chatDocument[index]['userId'],),);
解决方法
有几种不同的方法可以解决这个问题:
- 将
dummy
移动到全局范围:
struct entity {
int hp,atk,x,y;
};
entity dummy;
void Setup()
{
dummy.hp = 10;
dummy.atk = 2;
dummy.x = 5;
dummy.y = 5;
}
void Logic()
{
if (dummy is attacked)
dummy.hp -= 4;
}
int main()
{
Setup();
while (game is not over)
Logic();
}
- 将
dummy
移入main()
,然后通过引用(或指针)将其传递给Setup()
和Logic()
:
struct entity {
int hp,y;
};
void Setup(entity &e)
{
e.hp = 10;
e.atk = 2;
e.x = 5;
e.y = 5;
}
void Logic(entity &e)
{
if (e is attacked)
e.hp -= 4;
}
int main()
{
entity dummy;
Setup(dummy);
while (game is not over)
Logic(dummy);
}
- 上面#2 的扩展,然后您可以将
Setup()
和Logic()
移动到结构本身中:
struct entity {
int hp,y;
void Setup();
void Logic();
};
void entity::Setup()
{
hp = 10;
atk = 2;
x = 5;
y = 5;
}
void entity::Logic()
{
if (is attacked)
hp -= 4;
}
int main()
{
entity dummy;
dummy.Setup();
while (game is not over)
dummy.Logic();
}