2017-09-17 2 views
0

Ich möchte sqlite Abfrage mit angegebenen Callback ausführen. Die einzige Lösung, die ich mir vorstellen kann, ist, sqliteCallback als statische Funktion zu definieren, aber ich brauche sie nicht statisch, weil ich dort auf nicht-statische Member meiner Klasse zugreifen möchte. Wie man es richtig macht?Wie zu beheben "in diesem Fall" Verweis auf nicht-statische Member-Funktion aufgerufen werden muss?

class SqlDB { 

    private: 

     int someIntVar; 

     int sqliteCallback(void *NotUsed, int argc, char **argv, char **azColName) { 
      // Here I should have an access to non-static member: someIntVar 
      return 0; 
     } 

     void query(std::string queryStr) { 

      // Reference to non-static member function must be called: 
      int res = sqlite3_exec(_sqlHandle, queryStr.c_str(), SqlDB::sqliteCallback, 0, &_sqlliteErrMsg); 

     } 

}; 
+0

Warum sind sie in erster Linie dann statisch? In jedem Fall können Sie einen Verweis auf eine Instanz immer an eine statische Funktion übergeben. –

+2

Verwenden Sie nicht sqlite3_exec. Verwenden Sie vorbereiten, Schritt und finalisieren. –

+0

In einer 'statischen' Version könnte Ihre' void * NotUsed' 'void * instance' sein, die Sie in eine' SqlDB' zurückwerfen und verwenden, um eine Memberfunktion aufzurufen, die die eigentliche Arbeit leistet. – user4581301

Antwort

1

sqlite3_exec können Sie ein Benutzer Argument liefern, die Sie gewählt haben für welche Zwecke auch immer zusammen mit dem Rückruf zur Verfügung gestellt werden. Oft ist dies eine Identifikationsinformation. Hier werden wir es verwenden, um die SqlDB Instanz zu identifizieren, die Informationen von der Datenbank angefordert hat, indem this bereitgestellt wird.

void query(std::string queryStr) { 
    int res = sqlite3_exec(_sqlHandle, 
          queryStr.c_str(), 
          SqlDB::sqliteCallbackStatic, // use static callback function 
          this, // provide instance 
          &_sqlliteErrMsg); 

} 

static int sqliteCallbackStatic(void *instance, 
           int argc, 
           char **argv, 
           char **azColName) { 
    SqlDB * db = static_cast<SqlDB *>(instance); // cast instance back to SqlDB 
    db->sqliteCallbackMember(argc, argv, azColName); // call member function 
    return 0; 
} 

int sqliteCallbackMember(int argc, char **argv, char **azColName) { 
    // use someIntVar 
    return 0; 
} 
Verwandte Themen