gpt4 book ai didi

c++ - 回调函数设计的困惑

转载 作者:行者123 更新时间:2023-11-30 04:36:48 24 4
gpt4 key购买 nike

我正在设计一个库,用于拦截和处理来自消息队列的传入消息。图书馆用户将针对收到的不同类型的消息编写自己的消息处理函数。

我有一个 MessageConsumer 类需要处理不同类型的消息。我将所有处理函数组合到一个名为 MessageHandlerBase 的抽象基类中。库用户将从中继承并编写自己的 MessageHandler 类。

MessageConsumer 定义的相关部分:

class MessageConsumer {
protected:
const MessageHandlerBase* m_mesgHandler;
public:
MessageConsumer( const std::string& brokerURI,
const std::string& inputQueueName,
const MessageHandlerBase* messageHandler);
virtual ~MessageConsumer() { this->cleanup(); }
void runConsumer();

virtual void onMessage( const Message& message )
{
// code to receive and parse messages ...

if ( message is of type 1 ) {
m_mesgHandler->handle_message_type_1(message);
else if ( message is of type 2 ) {
m_mesgHandler->handle_message_type_2(message);
// ... and so on for different types of messages
}
};

MessageHandlerBase定义是

class MessageHandlerBase {
public:
virtual void handle_message_type_1( const Message& ) const =0;
virtual void handle_message_type_2( const Message& ) const =0;
virtual void handle_cms_exception() const {}
virtual void handle_transfer_interrupted() const {}
virtual void handle_transfer_resumed() const {}
};

用户通常只关心处理类型 1 和类型 2 的消息,所以我只是将它们制作成纯虚拟的。

我的大问题是:在实现他们自己的 MessageHandler 类的 handle_message_type_1handle_message_type_2 方法时,用户需要从一个(或多个)辅助类访问方法。如何让这些类可供 MessageHandler 使用,而不使其成为全局类?我可以将该类作为 void* 参数传递给 handle_message_type_1 但我不想这样做,因为 (i) 如果我需要传递多个函数怎么办,以及 (ii ) 然后我需要更改 MessageConsumer 中的调用;我想从 MessageConsumer 中完全抽象出这些消息处理细节。

有没有更优雅的方式来处理这整件事?

最佳答案

How can these classes be made available to MessageHandler, without making them global?

用户需要派生自您的类。是什么阻止他们将各种数据成员放入派生类中,引用他们需要的任何内容?

这是使用仿函数而不是函数指针的主要优点:它使 void* userData 过时了。

关于c++ - 回调函数设计的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4318305/

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