我的类中有一个静态方法,我用它来进行回调。
在这个回调中,我想为result
添加一个值。
由于重铸(?),这似乎不可能。
有没有办法访问成员变量result
并在重铸后为其添加值,或者我是否需要考虑不同的方式?
MyClass.h
class MyClass
{
public:
vector<string> result;
static int c_CB(void *data, int argc, char **argv, char **azColName);
int Callback(int argc, char **argv, char **azColName);
void Do(string query);
}
MyClass.cpp
void MyClass:Do(string query)
{
sqlite3_exec(this->dbResource, query.c_str(), this->c_CB , NULL, &this->errorMsg);
}
int MyClass::c_CB(void *NotUsed, int argc, char **argv, char **azColName)
{
MyClass* bar = reinterpret_cast<MyClass*>(NotUsed);
// after reinterpret cast, it does not work
//bar->result.insert(bar->result.end(), "foo");
// function call works
return bar->Callback(argc, argv, azColName);
}
int MyClass::Callback(int argc, char **argv, char **azColName)
{
cout << "working" << endl;
}
的main.cpp
int main()
{
MyClass* cl = new MyClass();
cl->Do("something");
}
答案 0 :(得分:1)
The documentation表示sqlite3_exec
的第四个参数作为回调的第一个参数传递。
目前您正在传递NULL
,然后将其转换为MyClass*
并尝试访问该对象,从而导致未定义的行为。
使用this
作为第四个参数代替NULL
。
答案 1 :(得分:0)
您似乎正在尝试从静态成员回调函数c_CB
访问非静态成员函数。
你能够调用一个成员函数Callback
,但是没有类可以访问,但如果我是正确的,编译器只是将Callback解释为一个静态函数。
如果您在此函数中实际断点,则可以看到您的所有成员变量实际上都没有内存地址。当前的类this
为空
我不确定cout <<
语句是否仍然有效或是否导致问题
这是您问题的可能解决方案,但可能不是最好的解决方案。
class MyClass
{
public:
vector<string> result;
static int c_CB(void *data, int argc, char **argv, char **azColName);
int Callback(int argc, char **argv, char **azColName);
void Do(string query);
void MemberFunction()
{
cout << "working" << endl;
}
static MyClass* currentClass; //Add a static class pointer and assign your class address to it before firing the callback.
}
MyClass* MyClass::currentClass = NULL;
void MyClass:Do(string query)
{
sqlite3_exec(this->dbResource, query.c_str(), this->c_CB , NULL, &this->errorMsg);
}
int MyClass::c_CB(void *NotUsed, int argc, char **argv, char **azColName)
{
MyClass* bar = reinterpret_cast<MyClass*>(NotUsed);
// after reinterpret cast, it does not work
//bar->result.insert(bar->result.end(), "foo");
// function call works
return bar->Callback(argc, argv, azColName);
}
int MyClass::Callback(int argc, char **argv, char **azColName)
{
currentClass->MemberFunction();
}
int main()
{
MyClass* cl = new MyClass();
MyClass::currentClass = this;
cl->Do("something");
}