首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >强制转换后的c++读访问冲突

强制转换后的c++读访问冲突
EN

Stack Overflow用户
提问于 2016-07-23 11:53:16
回答 2查看 423关注 0票数 0

我在类中有一个静态方法,我将其用于回调。在这个回调函数中,我想给result添加一个值。这似乎是不可能的,因为重铸(?)。

有没有办法访问成员变量result并在重新转换后向其添加值,或者我需要考虑一种不同的方法?

MyClass.h

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
int main()
{
  MyClass* cl = new MyClass();
  cl->Do("something");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-24 06:36:51

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

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

this代替NULL作为第四个参数。

票数 1
EN

Stack Overflow用户

发布于 2018-06-02 08:42:04

您似乎正在尝试从静态成员回调函数c_CB访问非静态成员函数。

您可以调用成员函数Callback,但是类中的任何内容都是不可访问的,但是如果我没记错的话,编译器只是将回调解释为静态函数。

如果你在这个函数中设置了断点,你会发现你的成员变量都没有内存地址。当前类this为空

我不确定cout <<语句是否仍然有效,或者是它导致了问题

这是您的问题的一种可能的解决方案,尽管它可能不是最好的。

代码语言:javascript
复制
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");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38537976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档