指向类变量中的函数的指针

问题描述 投票:0回答:3

是否可以在这个或另一个类的变量中保存指向类方法的指针?如果这是不可能的,我也想知道原因。

可以在类外部创建变量,并为其分配类方法。也称这种方法。但是,如果将此变量包含在类字段中,则示例将停止工作。

也可以使用this指针在类本身中调用此方法。为什么这样的工作呢?

不工作的例子。期望的结果

#include <iostream>

using namespace std;


class B {
public:
    typedef void (B::*function_type)(void);
    B::function_type _func;

    B() {
        cout << "B" << endl;
    }
    void foo(){
        cout << "B foo" << endl;
    }
};

int main()
{
    B b;
    b._func = &B::foo;

    (b.*_func)();
}

在课堂内打电话

#include <iostream>
#include <functional>

using namespace std;


class B {
public:
    typedef void (B::*function_type)(void);
    B::function_type _func;

    B() {
        cout << "B" << endl;
    }
    void foo(){
        cout << "B foo" << endl;
    }

    void run() {
        (this->*_func)();
    }
};

int main()
{
    B b;
    b._func = &B::foo;
    b.run();
}

我想保存一个类方法并通过一个对象调用它。

c++
3个回答
3
投票

调用_func指针涉及两个对象。一个是应该应用函数的对象,一个是保存指针的对象。当你在一个成员函数里面时,第一个是隐含的;这是内部的this指针。所以(this->*_func)()在当前对象上调用数据成员_func。当您在成员函数之外时,您必须提供两个对象:

(b.*b._func)();

左边的b就像第一个版本中的this->:它告诉编译器应用该函数的对象是什么。第二个b是持有指针的对象。

如果这完全令人困惑,请稍微改变一下情况。使用两个B对象并玩哪一个是:

B b;
B b1;

(b.*b1.func)();
(b1.*b.func)();

1
投票

有可能的。但语法有点可怕:

(b.*(b._func))();

为什么会那样?好吧,首先你需要引用对象_func的数据成员b。那就是b._func。接下来,您需要将该数据成员称为数据函数指针,即(b.*(..))()部分。

我建议通过创建一个执行疯狂调用语法的方法来简化调用方:

class B {
    // ...
    void call_me()
    {
        (this->*(_func))();
    }

};

b.call_me();

一些改进的提示:

使用using而不是typedef

using function_type = void (B::*)(void);

你不需要B::function_type。只要function_type就足够了,因为你在课堂范围内。


0
投票

您的第一个示例(不起作用的示例)只有在您引用静态函数时才能工作,因为静态方法可以在没有与您的情况对应的调用对象实例的情况下调用(b。*(b._func)) ();

所以,你可以这样写:

class B {

public:
    typedef void (*function_type)(void);
    function_type _func;

    B() { cout << "B" << endl;}
    static void foo(){ cout << "B foo" << endl; }
};

int main()
{
    B b;
    b._func = &B::foo;
    (b._func) ();
}
© www.soinside.com 2019 - 2024. All rights reserved.