2016-07-23 48 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的第四個參數。