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