修改
我尝试为此实现最小代码并且它有效。我回到我的代码,试图弄清楚那里有什么问题。这个问题从一开始就是错误的,将其留给未来的参考文献使用更正的最小代码(或者我应该删除它?)
#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的原因。任何帮助都非常感谢,因为我花了太多时间在这上面。感谢。
答案 0 :(得分:-2)
看起来你应该通过值接收指针而不是类。 这就是为什么你得到seg故障因为你的指针是空的 以下更改将解决您的问题:
MyClass(LibClass * objLibClass) : objLibClass(objLibClass) {}