成员功能C 的不同实现

Different implementations for a member function C++

本文关键字:实现 功能 成员      更新时间:2023-10-16

我有一个奇怪的问题。我已经开始在C /SFML中实现简单的游戏引擎。我实现了一个消息和消息队列系统,以便将模块解耦并避免任何令人困惑的依赖关系。我也实现了一个类实体,该实体代表游戏中的一个对象(包含其位置,精灵等(。

每个实体都有一个称为" on_message"的函数,当指定实体应接收消息时,消息队列被消息队列调用。(例如:如果实体P1是来自P2的消息的目的地,则MSG_Queue将调用P1.ON_MESSAGE传递MSG_TYPE" SADE损坏",以做某事。

我的问题,所有实体(类实体的对象(现在具有相同的函数on_message的实现。但是,此功能应从一个实体到另一个实体(因此,当按下"说"空间时,玩家的行为与敌人不同(

我有一个想法是使用继承,但我认为这不是正确的,好像游戏有100个实体,我应该做100堂课!?

有没有有效的想法可以解决这个问题?预先感谢

我有一个想法是使用继承,但我认为这不是正确的,好像游戏有100个实体,我应该做100堂课!?

这实际上是完全可能的,甚至对于足够定义的实体而言,它甚至可能是"正确的事物"。如果除了消息接收到的行为外,您还需要数据成员或其他自定义功能将所有内容包装在一起是一个好主意。

另一方面,如果您有很多非常相似的实体,并且在收到一些消息时的行为有所不同,则可能会有一个常见的超级类,该超类使用例如使用例如。可分配的std::function。这样的东西:

struct Entity {
    ...
    virtual ret on_message(msg_type msg) = 0;
};
...
struct LightweightCustomEntity : public Entity {
    std::function<ret(msg_type)> custom_on_message;
    virtual ret on_message(msg_type msg) override {
        if(!custom_on_message) return ret();
        return custom_on_message(msg);
    }
};
// ...
// in reality this would be a smart pointer or whatever
Entity *e = new LightweightCustomEntity;
e->custom_on_message = [](msg_type msg) {
    if(msg.type == SAY_DAMAGE) {
        return ret(42);
    }
    return ret();
};

这允许更多的运行时灵活性,但是请注意,您并没有真正获得太多的紧凑性 - 尤其是因为C 11我们可以继承构造函数,定义一个从Entity继承的新类,并且覆盖on_message或多或少地需要相同的代码。