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");
}
ドキュメントから: "sqlite3_exec()の第4引数は、各コールバック呼び出しの第1引数に中継されます。あなたはヌルポインタをキャストしてから、それが何を指しているのかを試しています。 NULLの – user657267
ありがとう、あなたは完全に正しいです。私が完全に理解できないことは、nullptrをキャストしたときにbar-> Callback(argc、argv、azColName)が機能するのはなぜですか? ありがとうagain – xhallix
これは未定義の動作です。つまり、動作しているか、そうでないかもしれないし、6ヶ月の猫の食べ物を注文しているかもしれません。 – user657267