【问题标题】:invoke non-const member function pointer on object在对象上调用非常量成员函数指针
【发布时间】:2018-06-25 02:42:35
【问题描述】:

我在对象上调用一些非 const 成员函数时遇到问题。 这个想法是在给定对象上调用成员函数。这适用于 const 函数,但如果我有一些非 const 函数并尝试更改其中的值,程序会崩溃并退出 code=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;
}

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

【问题讨论】:

  • exit code=3221225477 是 0xC0000005,这意味着 - 访问冲突。您是否尝试在调试器中单步执行您的代码?
  • 是的,我在 testVal ++ 评论的地方崩溃了
  • 那么,你调查过局部变量的值吗?知道它在哪里崩溃只是故事的一方面..
  • 第一次尝试更改值时崩溃
  • 请重新阅读我的评论。您的最新评论与我的问题无关。

标签: c++


【解决方案1】:

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

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

另外testFunction1testFunction2都不是const,你需要实际添加限定符:

void testFunction1() const

【讨论】:

  • 谢谢,但这并不是我想要达到的目标。我想更改我在循环中生成的对象的值。我发现 Test *test = new Test() 有效,这是一个愚蠢的错误。
猜你喜欢
  • 1970-01-01
  • 2019-07-09
  • 2012-12-13
  • 2015-12-05
  • 2016-08-17
  • 2010-09-26
  • 2012-04-20
  • 2015-05-01
  • 2014-08-07
相关资源
最近更新 更多