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");
}
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
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
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