我在类中有一个静态方法,我将其用于回调。在这个回调函数中,我想给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");
}
发布于 2016-07-24 06:36:51
The documentation声明sqlite3_exec
的第四个参数作为回调的第一个参数传递。
当前您正在传递NULL
,然后将其强制转换为MyClass*
并尝试访问该对象,这会导致未定义的行为。
用this
代替NULL
作为第四个参数。
发布于 2018-06-02 08:42:04
您似乎正在尝试从静态成员回调函数c_CB
访问非静态成员函数。
您可以调用成员函数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");
}
https://stackoverflow.com/questions/38537976
复制相似问题