gpt4 book ai didi

c++ - 从基类构造函数调用派生类的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:11 25 4
gpt4 key购买 nike

我有一种情况,我希望 System 的每个派生实例都通过我自己的事件系统订阅一个事件。基本上这意味着将 std::function 传递给事件,事件是另一个实例的成员字段。所以它基本上是这样的:

// System.h
class System
{
public:
System(std::shared_ptr<EntityManager> entityManagerPtr);
virtual ~System();
virtual void componentAddedEventHandler(void* source, const ComponentAddedEventArgs& args);
protected:
std::shared_ptr<EntityManager> m_entityManagerPtr;
};

以及使用委托(delegate)的实现:

// System.cpp
System::System(std::shared_ptr<EntityManager> entityManagerPtr) : m_entityManagerPtr(entityManagerPtr)
{
// Subscribe to the componentAddedEvent
m_entityManagerPtr->componentAddedEvent += [&](void* source, ComponentAddedEventArgs args) {
this->componentAddedEventHandler(source, args);
};
}

但很明显,如果不定义 System::componentAddedEventHandler() 就无法编译。

什么是最好的方法来确保从 System 派生的每个类都将订阅事件,并且它们都必须为事件处理程序定义自己的实现?还是强制这种行为太不方便,所以应该以其他方式实现?

最佳答案

OP 在评论中说(强调我的):

I was thinking I'd like to have all classes derived from System to subscribe to an event, and to be forced to implement their own handler for said event.

“所有派生自 X 的类”和“被迫”在同一句话中尖叫着要求纯虚成员函数。

struct System
{
virtual void foo() = 0;
};

struct Subsystem : public System
{
virtual void foo() override { /* forced to implement this */ }
};

如果您通过智能指针存储您的系统(也许在容器中),您可以为每个系统调用 foo() 并确保获得派生类的行为。

一切都很好,但是您不能从基类的构造函数中调用 foo()。这个问题的一个低技术含量的解决方案是使用工厂函数来构造每个对象。

template <typename T>
unique_ptr<T> make_system()
{
auto obj = make_unique<T>();
obj->foo();
return obj;
}

auto s1 = make_system<Subsystem1>();
auto s2 = make_system<Subsystem2>();

这两个对象都被强制实现 foo() 并且两个对象在使用之前都调用了 foo()。这仍然是两阶段初始化,但它隐藏在函数调用后面。

关于c++ - 从基类构造函数调用派生类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17154411/

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