2014-01-20 34 views
3

所以,我正在開發一個側面項目,以保持我的C++技能新鮮(我已經使用C++完成了多年)。我正在開發一些我將使用SQLite的東西。我有一個SQLite代碼的包裝。我注意到的一件事是,SQLite在其sqlite3_exec(...)函數中使用了c樣式的回調函數。在C++中使用SQLite:作爲回調的對象函數

我想回調函數是一個對象方法,因爲我希望它能夠修改對象變量,但不確定如何完全做到這一點。我已經檢查了其他類似的問題,但沒有任何幫助。

這裏是我如何申報我的包裝類:

class DBAdapter 
{ 
private: 
    sqlite3* db; 
    int getUserRecords(std::string); 
    std::vector<USER_RECORD> records; 

    int callbackSel(void*, int , char**, char**); 

public: 
    DBAdapter(); 
    ~DBAdapter(); 

    int open(std::string); 
    void close(); 

    int insertRecord(); 
    int deleteRecord(); 
    int getNumUserRecords(); 
}; 

這裏是我想使用回調(callbackSel),從getNumUserRecords內:

int DBAdapter::getUserRecords(std::string name) 
{ 
    std::string sql = "SELECT" + name + " from USERS"; 
    char* ErrMsg; 
    char* data; 

    int retval = sqlite3_exec(db,sql.c_str(),this->callbackSel,data,&ErrMsg); 
    return retval; 
} 

錯誤消息我我越來越是︰

error: ‘int (* DBAdapter::callbackSel)(void*, int, char**, char**)’ is not a static member of ‘class DBAdapter’ 

我的問題是,如果我使這個靜態函數,我不會abl e有權訪問我的矢量,記錄,對不對?有沒有辦法解決?

回答

1

有沒有辦法解決這個問題?

我不知道 API明確,但通常C風格的回調支持有從void*指針傳遞用戶數據(我猜你提到簽名的第一個參數)。什麼人通常做的是:

  1. ,聲明靜態類函數指定爲回調函數指針
  2. 實現該功能來傳遞用戶數據的指針轉換爲指針到您的類實例,並調用一個成員函數
  3. 有在提供你想要
  4. 將指針傳遞給您的操作類實例實施類中定義的成員函數,當你要去的靜態成員函數指針與C API
註冊

我希望這指出了正確的方向。

+0

這個工程,我想它會在我發佈之前。我基本上只是做了回調函數,以及vector,static。這是sqlite3_exec(...)函數的限制之一,回調函數必須具有特定的簽名,並且我無法修改它。無論如何,從設計角度來看,這對我來說似乎並不高雅。任何其他的想法,你將不勝感激。非常感謝你! – basil

相關問題