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

标签 c++ static callback

我的类中有一个静态方法,用于回调。 在此回调中,我想向 result 添加一个值。 由于重铸(?),这似乎是不可能的。

有没有办法访问成员变量result并在重铸后为其添加值,还是我需要考虑其他方法?

我的类.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);
}

我的类.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;
}

主要.cpp

int main()
{
  MyClass* cl = new MyClass();
  cl->Do("something");
}

最佳答案

The documentation声明 sqlite3_exec 的第四个参数作为回调的第一个参数传递。

当前您正在传递 NULL,然后将其转换为 MyClass* 并尝试访问该对象,这会导致未定义的行为。

使用 this 作为第四个参数来代替 NULL

关于转换后c++读取访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38537976/

相关文章:

javascript - 如何在分页事件中突出显示数据表中的单词

c++ - 与主执行模块和动态库的 2 种方式通信

c++ - STL vector 算子数据

Java : static keyword in middle of class

c# - .NET 垃圾收集器有很多静态变量

Java Class.forName() 与 Thread.currentThread().getContextClassLoader().loadClass()

javascript - Parse.com query.find 成功回调中的参数

c++ - 在 Visual Studio 中捕获控制台应用程序的输出

c++ - Mixin和接口(interface)实现

c++ - C++中有纯抽象类吗?