c ++在转换后读取访问冲突

时间:2016-07-23 03:53:16

标签: c++ static callback

我的类中有一个静态方法,我用它来进行回调。 在这个回调中,我想为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");
}

2 个答案:

答案 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");
}