在对象上调用非const成员函数指针

时间:2018-01-16 11:40:24

标签: c++

我在对象上调用一些非const成员函数时遇到问题。 我们的想法是在给定对象上调用成员函数。这适用于const函数,但如果我有一些非const函数并尝试更改其中的值,程序将崩溃并退出代码= 3221225477

#include <functional>
#include <iostream>
struct Test
{
    int testVal = 0;
    /* Call a given function on 10 objects */
    void callFunctionOnMultipleObjects(void (Test::*func)())
    {
        for(int i=0;i < 10; i++)
        {
            Test *test;
            Test::callTestFunction = func;
            Test::callTestFunction(test);
        }
        std::cout << "**************** \n";
    }

    /* Test Functions */
    void testFunction1(){
        std::cout << "some const/static action \n";
    }
    void testFunction2(){
        std::cout << "non const/static action \n";
        /* The Program crashes here */
        testVal ++;
    }
    std::function<void(Test *)> callTestFunction;
};
int main()
{
    Test test;
    test.callFunctionOnMultipleObjects(&Test::testFunction1);
    test.callFunctionOnMultipleObjects(&Test::testFunction2);
    return 0;
}

如何更改我的代码,以便我可以调用这样的非const函数?

1 个答案:

答案 0 :(得分:4)

您在未初始化的testFunction1变量指向的对象上调用testFunction2 Test *test;,导致两种情况下都出现未定义的行为。通过更改testFunction2来调用testVal尝试访问对象存储,因此显然会导致崩溃。您应该提供指向有效对象的指针:

callTestFunction(this); // no need for Test:: prefix

同样testFunction1 testFunction2都不是const,您需要实际添加限定符:

void testFunction1() const