【问题标题】:Help needed in Use of Function pointer in C++在 C++ 中使用函数指针需要帮助
【发布时间】:2011-07-20 05:41:24
【问题描述】:

我做了一个示例,在这个示例中,我尝试将函数作为参数传递,但出现错误,请您帮帮我

typedef void (*callbackptr)(int,int);

class Myfirst
{
public:
    Myfirst();
    ~Myfirst();

    void add(int i,callbackptr ptr)
    {
        ptr(i,3);
    }

};

class Mysec
{
public:
    Myfirst first_ptr;
    Mysec();
    ~Mysec();

    void TestCallback()
    {

        callbackptr pass_ptr = NULL;
        pass_ptr = &Mysec::Testing;
        first_ptr.add(2,&Mysec::Testing);
    }

    void Testing(int a,int b)
    {
      int c = a+b;
    }

};

【问题讨论】:

    标签: c++ callback function-pointers


    【解决方案1】:

    您作为参数传递的回调函数的类型未定义为类的一部分。您可能应该将Testing 定义为static

    【讨论】:

    • 能否请您更新我的代码并重新发布......因为这对我来说非常重要......
    • 静态无效测试(int a,int b); void MySec::Testing(int a,int b) // 按照你的类声明 { int c = a+b; }
    【解决方案2】:

    由于指向成员函数,因此出现错误。指向成员函数的指针是不同的。看这里: http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.1

    成员函数需要知道它正在使用的实例(this 指针),因此它不能像任何其他函数一样被调用。如果将回调函数移出类(或将其设为静态,类似于将其移出类),则可以像调用任何其他函数一样调用它。

    一种更现代的方法是使用函子,例如boost::function 和 boost::bind 之类的东西:

    C++ Functors - and their uses

    how boost::function and boost::bind work

    那些可以隐藏成员函数和全局函数之间的区别。

    【讨论】:

      【解决方案3】:

      你试图在这里访问一个成员函数指针,使用一个简单的函数指针 typedef,这是行不通的。让我解释。

      当您编写一个普通的非成员函数(类似于 C)时,该函数的代码实际上存在于函数名称所指示的位置 - 您可以将其传递给函数指针参数。

      但是,在成员函数的情况下,您所拥有的只是类定义;您还没有在内存中分配该类的实际实例。在这样的函数中,由于

      this
      指针尚未定义,任何对成员变量的引用都没有意义,因为编译器没有足够的信息来解析它们的内存位置。事实上,成员函数指针并不是精确的地址;它们编码的信息比这更多(您可能看不到)。更多信息,请阅读Pointers to Member Functions

      【讨论】:

        猜你喜欢
        • 2013-12-13
        • 1970-01-01
        • 2018-07-17
        • 2021-10-13
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-04
        相关资源
        最近更新 更多