編集:は、別のクラスのメンバ関数への一つのクラスのメンバ関数を渡す - セグメンテーション違反 - mrmpi
私は、このための最小限のコードを実行しようとしたし、それが働きました。私は自分のコードに戻って何が間違っているのか理解しようとしています。この質問修正し、最小限のコードで将来の参照のためにそれを残して、最初から間違っていた(または私はそれを削除してください)
#include <iostream>
class LibClass {
public:
int mapLibClass(void (*callbackfunc) (int, void*)) {
std::cout << " in map " << std::endl;
callbackfunc(8,NULL);
}
};
class MyClass {
public:
LibClass* objLibClass;
MyClass(LibClass* objLibClass) : objLibClass(objLibClass) { }
void runLibClass() {
std::cout << "in runLibClass" << std::endl;
objLibClass -> mapLibClass(&MyClass::callbackfunc);
}
static void callbackfunc(int i, void* ptr) {
std::cout << "in callback" << std::endl;
}
};
int main() {
LibClass* libClassObj = new LibClass();
MyClass myClassObj(libClassObj);
myClassObj.runLibClass();
return 0;
}
私はmrmpi図書館で働いている(とライブラリを知っている必要はありませんこの問題は以下で説明しますが、MapReduce for C++の実装です)。ライブラリーは、そのメンバ関数への引数としてコールバック関数を受け入れ:
class LibClass {
public:
int mapLibClass(void (*callbackfunc)(int, KV*, void*)) { }
};
今、私は(へのポインタ)LibClass型のメンバ変数を持っており、この変数通過のmapLibClass関数を呼び出す必要がある私自身のクラスを、持っています私のクラスの関数でそれに。
class MyClass {
public:
LibClass* objLibClass;
MyClass(LibClass objLibClass) : objLibClass(objLibClass) { }
void runLibClass() {
//I have some extra lines here checking to make sure other member variables and also objLibClass are set correctly
objLibClass -> mapLibClass(&MyClass::callbackfunc);
}
static void callbackfunc(int i, KV* kv, void* ptr) {
//just an std::cout here to make sure I get into this function
}
};
int main() {
LibClass* libClassObj = new LibClass();
MyClass myClassObj(libClassObj);
myClassObj.runLibClass();
return 0;
}
runLibClass関数内からmapLibClassが呼び出されるまではすべてがスムーズに進みます。 mapLibClassはいくつかのことをして、それがパラメータとして受け入れるコールバック関数を呼び出すことになっています。しかし、私は私のプログラムを実行しているときにコールバック関数を入力することはありませんが、私はセグメンテーション違反を取得します。
callbackfuncを非メンバ関数にすると、プログラムが正しく実行されるため、メンバ関数を渡すことと関係があります。私はドキュメントや他のSOの記事を読んだが、私のメンバーcallbackfuncは静的でなければならない(それはコンパイルされていない)か、boost :: bindとboost :: functionを使うべきである私はライブラリのソースコードを変更する)。私はsegfaultの原因を突き止めることはできません。私はこれに多くの時間を費やしたので、どんな助けも高く評価されます。ありがとう。
はコンパイルされませんし、非会員と静的メンバ関数の間に違いはありませんhttp://ideone.com/trITGM – Stargateur
を再現することはできません。明白なエラーを修正した後で、あなたの例は動作します(http://ideone.com/IJredv)。 [mcve]を投稿してください。 –
申し訳ありません。私は最初のコメントの後に最小限のコードを書き始めました:http://ideone.com/70THz8 ...そして...それは今実行されます。私は他のどこかで問題を探すべきです。 – armen