gpt4 book ai didi

c++ - 如何在不暴露类细节的情况下传递函数指针

转载 作者:太空宇宙 更新时间:2023-11-04 14:36:36 24 4
gpt4 key购买 nike

我正在创建一个需要允许用户设置回调函数的库。该库的界面如下:

// Viewer Class Interface Exposed to user
/////////////////////////////
#include "dataType_1.h"
#include "dataType_2.h"

class Viewer
{
void SetCallbackFuntion( dataType_1* (Func) (dataType_2* ) );
private:
dataType_1* (*CallbackFunction) (dataType_2* );
}

在典型的用法中,用户需要在回调中访问 dataType_3 的对象。然而,这个对象只有他的程序知道,如下所示。

// User usage
#include "Viewer.h"
#include "dataType_3.h"

// Global Declaration needed
dataType_3* objectDataType3;

dataType_1* aFunction( dataType_2* a)
{
// An operation on object of type dataType_3
objectDataType3->DoSomething();
}

main()
{
Viewer* myViewer;
myViewer->SetCallbackFunction( &aFunction );
}

我的问题如下:如何避免为 objectDataType3 使用丑陋的全局变量?(objectDataType3 是 libraryFoo 的一部分,所有其他对象 dataType_1、dataType_2 和 Viewer 都是 libraryFooBar 的一部分)因此我希望它们尽可能保持独立。

最佳答案

不要在 C++ 中使用 C。

使用界面来表示您想要通知的事实。
如果您希望 dataType_3 类型的对象收到查看器中发生的事件的通知,那么只需让该类型实现该接口(interface),然后您就可以直接向查看器注册该对象以获取通知。

// The interface
// Very close to your function pointer definition.
class Listener
{
public: virtual dataType_1* notify(dataType_2* param) = 0;
};
// Updated viewer to use the interface defineition rather than a pointer.
// Note: In the old days of C when you registered a callback you normally
// also registered some data that was passed to the callback
// (see pthread_create for example)
class Viewer
{
// Set (or Add) a listener.
void SetNotifier(Listener* l) { listener = l; }
// Now you can just inform all objects that are listening
// directly via the interface. (remember to check for NULL listener)
void NotifyList(dataType_2* data) { if (listener) { listener->notify(data); }

private:
Listener* listener;
};

int main()
{
dataType_3 objectDataType3; // must implement the Listener interface

Viewer viewer;
viewer.SetNotifier(&objectDataType3);
}

关于c++ - 如何在不暴露类细节的情况下传递函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4625753/

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