2017-09-02 11 views
0

sqliteコールバック関数からクラス内のアクセス変数が必要です。私は他の関数からこの変数にアクセスする必要があるので、静的にすることはできません。これは私の現在のコードです。
メンバ変数へのアクセス方法sqliteコールバック

class fromdb { 
private: 
    string paramdb; 
    char* errmsg; 
    string param; 
    string title; 
    string creator; 
    char* bin; 
public: 
    static int callback(void *data, int argc, char **argv, char **azColName){ 
     int lenght; 
     lenght = sizeof(*argv[3]); 
     title = *argv[1]; 
     creator = *argv[2]; 
     bin = new char[lenght]; 
     bin = argv[3]; 
     return 0; 
} 
void getdata() { 
string tQuery = "SELECT * FROM test WHERE " + paramdb + "=\"" + param + "\")"; 
    sqlite3_exec(db, tQuery.c_str(), fromdb::callback, (void*)data, &errmsg); 
} 
}; 

ログ

undefined reference to `fromdb::title[abi:cxx11]' 
undefined reference to `fromdb::creator[abi:cxx11]' 
undefined reference to `fromdb::bin' 
+1

コールバックパラメータ_1stの引数でクラスの 'this'ポインタを渡します。https://sqlite.org/c3ref/exec.html –

+0

' bin = new char [lenght]; bin = argv [3]; 'なぜあなたは次の行にそれを漏らすだけのメモリを割り当てますか? –

+0

sqlite3_exec(db、tQuery.c_str()、this-> callback、(void *)data、&errmsg)に変更した後。私はこのエラーがあります:/root/Dokumenty/musicdb/funcs.h|94 |エラー:非静的メンバー関数の無効な使用 'int fromdb :: callback(void *、int、char **、char **)' | – BigAdam

答えて

1

あなたは、静的な関数から非静的メンバを使用しようとしているので、あなたは未定義の参照を取得しています。

It cannot be static because I need access this variables from other functions

あなたはまだstatic機能を使用できますが、@Richard Critten points out in the commentsとして、内のメンバーを渡す必要があり、またはあなたがfriend機能を使用することができます。

ここで私はあなたのようなstatic機能を使用して、証明するためにあなたのコードのより簡単なバージョンを持って作成されますが、メンバ変数を渡しました:

class artwork 
{ 
private: 
    std::string title; 
    std::string creator; 
public: 
    static int populateFromDB(void* object, int, char** data, char**) 
    { 
     if (artwork* const art= static_cast<artwork*>(object)) 
     { 
      art->title = data[1]; 
      art->creator = data[2]; 
     } 
     return 0; 
    } 
}; 

artwork a; 
char* error = nullptr; 
if (sqlite3_exec(db, tQuery.c_str(), &artwork::populateFromDB, static_cast<void*>(&a), &error) != SQLITE_OK) 
    sqlite_free(error) 

またはその代わりfriend関数として:

class artwork 
{ 
    friend int getArtwork(void*, int, char**, char**); 
private: 
    std::string title; 
    std::string creator; 
};  
int getArtwork(void* object, int, char** data, char**) 
{ 
    if (artwork* const art = static_cast<artwork*>(object)) 
    { 
     art->title = data[1]; 
     art->creator = data[2]; 
    } 
    return 0; 
} 

artwork a; 
char* error = nullptr; 
if (sqlite3_exec(db, tQuery.c_str(), &getArtwork, static_cast<void*>(&a), &error) != SQLITE_OK) 
    sqlite_free(error) 
関連する問題