c++ - 如何在 C++ 中为 sqlite 进行非静态回调?

标签 c++ sqlite c++11

我有一些代码可以从数据库中获取数据并将其存储在结构中,但我收到错误消息“必须调用对非静态成员函数的引用”。

class ScoreManagement {

private:
    int callback(void *NotUsed, int argc, char **argv, 
                char **azColName) {

        NotUsed = 0;


        playerRecords[player_number].name =  argv[1] ? argv[1] : "NULL";

        player_number++
        return 0;
    }

    void showScore(string userinput) {
        string query = "SELECT * FROM SCORES"; 

        sqlite3_exec(DB, query.c_str(), callback, NULL, NULL);

    }
};

最佳答案

诀窍是创建一个静态“辅助”方法,并使用回调签名中提供的空指针参数将指向您的对象的指针传递到该方法中。然后静态辅助方法可以使用该指针来调用非静态方法:

class ScoreManagement {
public:
   static int callback(void *objPtr, int argc, char **argv, char **azColName) {
      return ((ScoreManagement *)objPtr)->callbackAux(argc, argv, azColName);
   }

private:
   int callbackAux(int argc, char ** argv, char ** azColName) {
      playerRecords[player_number].name =  argv[1] ? argv[1] : "NULL";
      player_number++;
      return 0;
   }
};

[...]

// Note that you must pass in a pointer to your `ScoreManagement` object
// as an argument here, so that it will be passed in to `callback()`
sqlite3_exec(DB, query.c_str(), ScoreManagement::callback, &myScoreManagementObject, NULL);

关于c++ - 如何在 C++ 中为 sqlite 进行非静态回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54848606/

相关文章:

c++ - 在什么情况下我应该明确需要实现 move 构造函数和 move 赋值运算符?

c++ - 如何从模板中的对象 vector 上获取迭代器?

c++ - 当两个 std::map 对象相同时

Android SQLite 日期查询问题,无法比较 2 个日期之间的记录

python - 如何在不使用 sudo 命令的情况下在 Linux 上的单独目录中安装 python3.7 的 sqlite3?

c++ - 将字符串与变量连接起来并将其视为 C/C++ 中的宏

c++ - 同一类对象之间的分支预测

c++ - 程序 VC++ Win32 应用程序出错?

android - 将 'CallLog.Calls' 存储到另一个表中

c++ - std::tuple,通过继承类型获取项目