将一个类的成员函数传递给另一个类的成员函数 - segfault - mrmpi

时间:2016-12-03 23:41:41

标签: c++ mapreduce parameter-passing

修改

我尝试为此实现最小代码并且它有效。我回到我的代码,试图弄清楚那里有什么问题。这个问题从一开始就是错误的,将其留给未来的参考文献使用更正的最小代码(或者我应该删除它?)

#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的原因。任何帮助都非常感谢,因为我花了太多时间在这上面。感谢。

1 个答案:

答案 0 :(得分:-2)

看起来你应该通过值接收指针而不是类。 这就是为什么你得到seg故障因为你的指针是空的 以下更改将解决您的问题:

MyClass(LibClass * objLibClass) : objLibClass(objLibClass) {}