我正在设计一个库,该库将用于拦截和处理来自消息队列的传入消息。图书馆用户将针对收到的各种消息编写自己的消息处理功能。
我有一个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_1
和handle_message_type_2
方法时,用户需要从一个(或可能更多)帮助器类中访问方法。如何使这些类可用于MessageHandler
而不使它们成为全局类?我可以将类作为void*
参数传递给handle_message_type_1
,但我不想这样做,因为(i)如果我需要传递多个函数,并且(ii)我需要更改MessageConsumer
的调用,该怎么办?我想从MessageConsumer
中完全提取这些消息处理细节。有没有更优雅的方式来处理整个事情?
最佳答案
用户需要从您的类(class)中派生。是什么阻止他们将各种数据成员放入其派生对象,并引用他们所需的内容?
那是使用函子而不是函数指针的主要优点:它使void* userData
过时。
关于c++ - 关于回调函数设计的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4318305/