Использование SQLite в C ++: объектная функция в качестве обратного вызова
Итак, я работаю над сайд-проектом, чтобы сохранить свои навыки в области c ++ (прошло много лет с тех пор, как я работал в c ++). Я работаю над тем, где я буду использовать SQLite. У меня есть обертка вокруг кода SQLite. Одна из вещей, на которые я обращаю внимание, - это то, что SQLite использует функции обратного вызова в стиле c в своей функции sqlite3_exec (...).
Я хотел бы, чтобы функция обратного вызова была объектным методом, так как я хотел бы, чтобы он мог изменять переменные объекта, но не уверен, как именно это сделать. Я проверял другие подобные вопросы на stackoverflow, но ничего не помог.
Вот как я объявляю свой класс-обёртку:
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’
Моя проблема в том, что если я сделаю это статической функцией, я не смогу получить доступ к своему вектору, записям, верно? Есть ли способ обойти это?