2016-07-23 10 views
0

Ich habe eine statische Methode in meiner Klasse, die ich für einen Rückruf verwenden. In diesem Rückruf möchte ich result einen Wert hinzufügen. Dies scheint wegen der Neufassung (?) Nicht möglich zu sein.C++ Lesezugriffsverletzung nach dem Casting

Gibt es eine Möglichkeit, auf die Elementvariable result zuzugreifen und nach der Neuformatierung Werte hinzuzufügen, oder muss ich an einen anderen Weg denken?

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

Aus der Dokumentation: „Das vierte Argument sqlite3_exec() wird bis zum ersten Argument jedes Callback-Aufruf weitergeleitet“, werden Sie einen Null-Zeiger Gießen und was dann versuchen, den Zugriff auf sie verweist auf, übergeben 'this' statt von 'NULL'. – user657267

+0

danke, du warst vollkommen richtig. Die Sache, die ich nicht ganz verstehe, warum funktioniert bar-> Callback (argc, argv, azColName), wenn ich ein nullptr geworfen habe? danke nochmal – xhallix

+2

Es ist undefiniertes Verhalten, was bedeutet, dass es funktionieren könnte, es könnte nicht, oder es könnte sogar 6 Monate Katzenfutter bestellen. – user657267

Antwort

1

The documentation besagt, dass das vierte Argument sqlite3_exec als das erste Argument der übergeben wird Rückrufen.

Derzeit übergeben Sie NULL, die Sie dann auf MyClass* werfen und versuchen, auf das Objekt zuzugreifen, was zu undefiniertem Verhalten führt.

Verwenden Sie this als viertes Argument anstelle von NULL.