铸造后C+读取访问冲突

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (56)

我在我的类中有一个静态方法,用于回调。在这个回调中,我想添加一个值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");
}
提问于
用户回答回答于

第四个参数sqlite3_exec作为回调的第一个参数传递。

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

使用this在地方的第四个参数NULL

用户回答回答于

看起来你试图从一个静态成员回调函数访问一个非静态成员函数c_CB

你可以调用成员函数,Callback但是没有任何东西可以访问,但是如果我是正确的,编译器只是将Callback解释为一个静态函数。

如果你真的在这个函数内断点,你可以看到你的所有成员变量都没有内存地址。而当前的类this是null

我不确定该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");
}

所属标签

可能回答问题的人

  • gulu丶咕噜

    0 粉丝1 提问5 回答
  • EatRice

    16 粉丝0 提问4 回答
  • 华讯云

    0 粉丝0 提问4 回答
  • 卓脑域名

    0 粉丝0 提问3 回答

扫码关注云+社区

领取腾讯云代金券