您收到未定义的引用,因为您尝试使用静态函数中的非静态成员。
它不能是静态的,因为我需要从其他函数访问这个变量
您仍然可以使用static
函数,但你需要传递一个成员,如@Richard Critten 在评论中指出 https://stackoverflow.com/questions/46015168/how-to-access-member-variables-sqlite-callback#comment78990577_46015168,或者您可以使用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)
Or as a 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)