我想做以下事情:
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静态的成员,但我认为这是一个相当糟糕的设计.你能想到解决这个问题吗?
这是一个适合您的示例的完整工作程序。
#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在那里摧毁,并记住你正在传递this到B,可能是危险的东西(被摧毁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)
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |