【问题标题】:How to make a non-static callback in c++ for sqlite?如何在 c++ 中为 sqlite 进行非静态回调?
【发布时间】:2019-07-17 19:38:18
【问题描述】:

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

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);

    }
};

【问题讨论】:

标签: c++ sqlite c++11


【解决方案1】:

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

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);

【讨论】:

  • 可能会调用 'NotUsed' 其他东西,例如 ObjectPointer。
猜你喜欢
  • 2022-06-12
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多