传递成员函数(或变通方法)

cth*_*thl 5 c++

我想做以下事情:

class A{
private:
  //some data
  B b;
  double f(double);
public:
  A(){
    b = new B(f); // does not work of course
  }
};

class B{
public:
  B(double (*func)(double));
};
Run Code Online (Sandbox Code Playgroud)

B类应该解决函数func指定的数学问题.A类现在应该使用B来解决func = f的这个问题.成员函数f访问A的私有数据成员.问题是,当然我不能简单地将指针传递给成员函数.我知道有办法做到这一点,但B应该仍然能够承担任何功能,而不仅仅是A的成员.到现在为止,我只是制作了f和A静态的成员,但我认为这是一个相当糟糕的设计.你能想到解决这个问题吗?

Mir*_*pas 2

这是一个适合您的示例的完整工作程序。

#include <memory>
#include <iostream>
#include <functional>

class B
{
    public:
        B(std::function<double(double)> func)
        {
            std::cout<<func(1.0);
        }
};

class A
{
    private:
        std::unique_ptr<B> b;

        double f(double)
        {
            std::cout<<"A::f";
            return 2.0;
        }

    public:
        A() : b(new B(std::bind(&A::f, this, std::placeholders::_1)))
        {
        }
};

int main()
{
    A a;
}
Run Code Online (Sandbox Code Playgroud)

请注意,你不要b在那里摧毁,并记住你正在传递thisB,可能是危险的东西(被摧毁B后可能还活着A,如果你this在里面使用f......繁荣!)。

我还建议避免使用指针,如果不可能使用std::unique_ptr

b编辑:还有一个没有指针的版本,std::function以及std::bind

#include <iostream>

class A;

class B
{
    public:
        B(A* obj, double(A::*func)(double))
        {
            std::cout<<(obj->*func)(1.0);
        }
};

class A
{
    private:
        B b;
        double f(double)
        {
            std::cout<<"A::f";
            return 2.0;
        }

    public:
        A():b(this, &A::f)
        {
        }
};

int main()
{
    A a;
}
Run Code Online (Sandbox Code Playgroud)