gpt4 book ai didi

c++ - 不重复地公开对象的子方法

转载 作者:行者123 更新时间:2023-11-28 03:41:32 25 4
gpt4 key购买 nike

我有一个 Level 类的对象,它有几个用于管理其状态的子系统(子对象)(例如 EntityManagerInputManager , 物理)。我想在Level的外部接口(interface)中暴露那些子系统的一些方法。

这是一种解决方案:

uint32_t Level::CreateEntity()
{
return entityManager.CreateEntity();
}

Entity& Level::GetEntity(uint32_t entityId)
{
return entityManager.GetEntity(entityId);
}

uint16_t Level::CreateInputState()
{
return inputManager.CreateInputState();
}

void Level::AttachInputState(uint32_t entityId, uint16_t inputStateId)
{
inputManager.AttachInputState(entityId, inputStateId);
}

InputState& Level::GetInputState(uint16_t inputStateId)
{
return inputManager.GetInputState(inputStateId);
}

此解决方案要求我在 Level 类中复制方法声明,并编写将控件重定向到子系统的单行调用。在我过去从事的项目中,这很难管理。

另一种解决方案是在公共(public)接口(interface)中公开子系统。最好可以避免这种情况,因为对于 Level 之外的对象来说,将调用转发到哪个子系统并不重要。

有没有一种设计可以更优雅地处理这个问题?

最佳答案

应 OP 的要求,我将发布我在评论中建议的解决方案。我相当确定,在新的 C++ 标准中有一个更好的模板,但无论如何我会发布预处理器解决方案,它很丑,不应该使用!

#define FUNCTION_DECLARATION(RETURNTYPE, FUNCTIONNAME, ...) \
RETURNTYPE FUNCTIONNAME(__VA_ARGS__)

这将在类声明中用作:

class Level {
FUNCTION_DECLARATION(uint32_t, CreateEntity);
FUNCTION_DECLARATION(Entity&, GetEntity, uint32_t);
};

定义如下:

#define FUNCTION_DEFINITION(RETURNTYPE, PROPERTY, FUNCTIONNAME, ...) \
RETURNTYPE Level::FUNCTIONNAME(__VA_ARGS__) \
{ \
return PROPERTY.FUNCTIONNAME(__VA_ARGS__); \
} \

现在是使这项工作变得非常丑陋的用法:

FUNCTION_DEFINITION(Entity&, entityManager, GetEntity, uint32_t(entityId))

我不能保证这适用于任何类型,而且我还没有测试大部分代码。如您所见,这种对输入的“破解”仅适用于普通类型,不适用于引用或指针。在类上它将触发复制构造函数!

当然,这可以通过将 VA_ARGS 替换为函数的每个参数的类型和变量名的变量来改进,但这同样非常乏味,并且必须为每个应该的参数编写一个模板用过的。这将产生几乎与以前一样多的代码。

所以让我再次声明:坚持使用模板,它们比这好得多!只是我不知道如何与他们一起做。所以,如果有人知道如何使用模板,请不要因为这个 ** 代码而抨击我,而是写出这里每个人都渴望的美丽解决方案。

关于c++ - 不重复地公开对象的子方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9038726/

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