gpt4 book ai didi

c++ - 避免循环引用

转载 作者:太空宇宙 更新时间:2023-11-04 13:32:22 25 4
gpt4 key购买 nike

我正在使用 SDL 构建一个小游戏。我有一个 GameObject 类,它是在我的游戏中表示对象的主要类。可以从外部注入(inject)的组件解决了不同的行为:

#include "Input.h"
class GameObject
{
public:
void setInput(Input* input)
{
input->setGameObject(this);
this->input = input;
}
}


class GameObject; // cannot #include "GameObject.h"
class Input
{
private:
GameObject* object;
public:
void update(float elapsedTime)
{
// do fancy stuff on the GameObject object
}
void setGameObject(GameObject* object)
{
this->object = object;
}
}

Input 类必须在 GameObject 实例上工作。我现在有一个循环引用,我猜这不是个好主意?

编辑:我调整了示例以使其更清晰。我有一些这样的组件,比如 Input 类,我必须使用这个 class GameObject; 语句,因为我不能包含头文件。所以如果我理解正确的话我有一个循环引用!?要解决这个问题,我必须使用一个接口(interface)并将其添加到 setGameObject(InputInterface* object)。但我无法预测访问 GameObject 需要哪些函数/成员,因为使用了不同的组件(例如 PlayerInputDemoInputAiInput, ...).

最佳答案

看起来你在使用原始指针(我个人认为这是个坏主意),所以我认为使用这个循环引用没有问题,只记得检查是否为空。

如果您使用更智能的指针类型,在这种情况下,您将在一个方向(“包含”另一个方向)使用强引用,在另一个方向(只需要一种通信方式的方向)使用弱引用).

例如,您的游戏对象可能拥有输入机制;但输入机制只需要一种将输入传达给游戏对象的方法。

std::weak_ptr is used to break circular references of std::shared_ptr.

参见:http://en.cppreference.com/w/cpp/memory/weak_ptr

此外,检查您的输入是否真的需要保留整个游戏对象,或者只是具有特定接口(interface)的一些对象。在这种情况下,事件机制或委托(delegate)模式可以帮助您消除一些硬依赖。

关于c++ - 避免循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30940050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com