【问题标题】:can i use mem_fun like this?我可以像这样使用 mem_fun 吗?
【发布时间】:2012-12-02 03:57:05
【问题描述】:

我想在运行时设置函数指针。但我被困在这里。当我使用全局函数或静态类成员函数时,一切正常。但是,当函数是普通的类成员函数时。我总是遇到编译器错误。 代码如下:

class A   
{
    int val;
public:
    A() { val = 0; }
    A(int j) { val = j; }

    int aFun(int k) {val -= k; return val; }
};

typedef int (* func)(int );
class B
{
    func m_addr;
public:
    B(func param)
        : m_addr(param)
    {

    }
    void execute()
    {
        cout << m_addr(9) << endl;
    }
};

我正在尝试这样使用它们:

/* 错误 C2355: 'this' : 只能在非静态内部引用 成员函数错误 C2064:术语不计算为函数 带 1 个参数的类没有定义“操作员()”或用户 将转换运算符定义为指向函数的指针或 接受适当数量参数的函数引用 */

A a;
B b(A::aFun); 
b.execute();

在google了很多之后,我发现std::mem_fun 可能会有所帮助。但我不知道如何使用它。谁能帮帮我?

PS:我使用的是 Visual C++ 2010

【问题讨论】:

    标签: c++ windows algorithm stl c++11


    【解决方案1】:

    类成员函数有一个由编译器传递给它的额外参数this,因此编译器将aFun视为开始声明并写为

    int A::aFun(A* this, int k)
    {
        this->val -= k;
        return this->val;
    }
    

    静态/全局函数没有这个参数,所以编译成功。

    为了使用A::aFun,你需要一个A类的实例。

    【讨论】:

    • 那么,您对我的帖子有什么解决方案? std::mem_fun 怎么样?
    【解决方案2】:

    修改如下:

    static int val;
    
    class A   
    {
    
    public:
        A() { val = 0; }
        A(int j) { val = j; }
    
      static  int aFun(int k) {val -= k; return val; }
    };
    

    【讨论】:

      【解决方案3】:

      我没有确切了解您要做什么,但我看到了一个错误,也许对您有帮助。

      这是一个指向函数的指针,不是吗?

       typedef int (* func)(int );
      

      但是你没有函数,你有一个类的方法。 (成员函数) 所以typedef应该是概率:

      typedef int (A::*func)(int );
      

      希望对你有所帮助,你可以google一下成员函数的指针,你会找到一些例子。

      祝你好运!

      【讨论】:

      • 注意:如果您完全尝试我的代码将无法正常工作,因为 A::aFun 尚未在 B 中实例化。
      • 注2:现在,B b(A::aFun);可能是 B b(&A::aFun);
      猜你喜欢
      • 1970-01-01
      • 2011-03-11
      • 2013-02-08
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 2013-01-15
      相关资源
      最近更新 更多