2016-07-23 105 views
0

我在我的类中有一个静态方法,我使用它作为回调。 在此回调中,我想为result添加一个值。 由于重铸(?),这似乎不可行。转换后C++读取访问冲突

有没有方法可以访问成员变量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

从文档:“sqlite3_exec()的第四个参数被传递到每个回调调用的第一个参数”,您正在投射一个空指针,然后尝试访问它指向的内容,通过this this 'NULL'。 – user657267

+0

谢谢,你完全正确。为什么bar-> Callback(argc,argv,azColName)工作,当我铸造一个nullptr? 再次感谢 – xhallix

+2

这是未定义的行为,这意味着它可能工作,它可能不会,或者它甚至可能会订购你6个月的猫粮。 – user657267

回答

1

The documentation指出第四个参数sqlite3_exec作为的第一个参数传递回电话。

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

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