Как сделать нестатический обратный вызов в C ++ для SQLite? - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть некоторый код, который получает данные из базы данных и сохраняет их в структуре, но я получаю сообщение об ошибке "должна быть вызвана ссылка на нестатическую функцию-член".

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

    }
};

1 Ответ

0 голосов
/ 24 февраля 2019

Хитрость заключается в том, чтобы создать статический «вспомогательный» метод и использовать аргумент void-pointer, предоставленный в callback-подписи, чтобы передать указатель на ваш объект в этот метод.Затем статический вспомогательный метод может использовать этот указатель для вызова нестатического метода:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...