2016-07-23 5 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()の第4引数は、各コールバック呼び出しの第1引数に中継されます。あなたはヌルポインタをキャストしてから、それが何を指しているのかを試しています。 NULLの – user657267

+0

ありがとう、あなたは完全に正しいです。私が完全に理解できないことは、nullptrをキャストしたときにbar-> Callback(argc、argv、azColName)が機能するのはなぜですか? ありがとうagain – xhallix

+2

これは未定義の動作です。つまり、動作しているか、そうでないかもしれないし、6ヶ月の猫の食べ物を注文しているかもしれません。 – user657267

答えて

1

The documentationsqlite3_exec第4引数は最初の引数として渡されると述べています折り返し電話。

現在、NULLを渡しています。MyClass*にキャストし、そのオブジェクトにアクセスしようとすると、定義されていない動作が発生します。

NULLの代わりに第4引数にthisを使用してください。

関連する問題