在c++库中创建回调函数

Creating a Callback Function in a C++ Library

本文关键字:回调 函数 创建 c++      更新时间:2023-10-16

我想创建一个包含多个对象并照顾它们的库。但是,如果某些事情发生在对象上,那么我希望能够在使用库的项目中执行其他操作。

下面是我想做的一个简短的例子:

// Library:
class LibraryClass {
    public:
        bool Init() { /* Blah. */ }
        void Shutdown() { /* Blah blah. */ }
        void Update() {
            for( int i( 0); i < m_objects.size(); ++i) {
                bool somethingHappened = m_objects[i].Update();
                if( somethingHappened)
                    CallBackFunctionToMainProject( &m_objects[i]);
            }
        }
    private:
        std::vector<Objects> m_objects;
};
// Project that uses the library:
class Program {
    public:
        void Run() {
            m_libClass = new LibraryClass();
            m_libClass.Init();
            while( true) {
                m_libClass.Update();
                OtherUpdateStuff();
            }
            m_libClass.Shutdown();
            delete m_libClass;
        }
    private:
        LibraryClass* m_libClass;
};

void CallBackFunctionToMainProject( Object* obj) {
    // Do stuff.
}

所以你可以看到,我希望库调用在主项目中声明的函数,但是我也希望它不抱怨,如果函数没有在主项目中声明。

我可以这样做吗?如果有,是怎么做到的?(如果可能的话,我希望避免将变量传递给库的选项,例如函数指针)。

有可能的选择,但必须传递/设置一些东西给库以进行回调。

  1. 从主程序传递一个函数指针(你已经提到过)。
  2. 在库中定义一个接口类,由主程序实现并传递给库(更优雅)。
  3. 在库可以访问的某个地方注册一个函数指针或接口对象(只是比直接传递的间接级别)

希望能有所帮助。