将成员函数分配给函数指针
assign a member function to a function pointer
如果我有两个这样的 类 :
class A
{
public:
int *(*fun)( const int &t );
A( int *( *f )( const int &t ) ) : fun( f ) {}
};
class B
{
private:
float r;
int *f(const int &t)
{
return new int( int( r ) + t );
}
A a;
B() : a( A( f ) ) {}
};
这会导致编译器错误。
我想将f
赋值给a
的函数指针。
问题是 A
可以被许多 类 使用,而不仅仅是 B
,所以我不能简单地将 fun
定义为 B::*fun
。
None 我在互联网上和 Whosebug 上找到的帖子解决了使用函数指针的问题,其中许多 类 每个都有自己的成员函数,但原型相同。
那怎么办?
So what to do
不多。除了在对象类型上模板化 A
之外,它将保存指向成员函数的指针,该成员函数引用 const int 并返回指向 int 的指针。
您要做的是将指向自由函数的指针与指向成员函数的指针混合。虽然听起来它们都是函数指针,但它们的不同之处足以使它们无法通过相同的类型定义。
您的代码看起来令人困惑,而且就我个人而言,我认为 C 函数指针 在 C++ 的 OO 实现 上看起来很难看。所以我建议你使用 std::function
。自 C++11
以来才可用。如果您不能使用它,请尝试查看 Boost's Implementation.
我可以举例说明如何使用 std::function
:
bool MyFunction(int i)
{
return i > 0;
}
std::function<bool(int)> funcPointer = MyFunction;
使用它您将大大提高代码的可靠性。针对你的问题,具体来说:
class A
{
public:
std::function<int*(const int&)> fun;
A(std::function<int*(const int&)> f) : fun(f) {}
};
class B
{
private:
float r;
int *f(const int &t)
{
return new int(int(r) + t);
}
A *a;
B()
{
std::function<int*(const int&)> tempFun = std::bind(&B::f, this, _1);
a = new A(tempFun);
}
};
您必须添加以下命名空间:
using namespace std::placeholders;
this result in compiler error
因为 f
是 A
的非静态成员函数返回 int*
,它接受对 int
的单个常量引用。这意味着,它的类型不是:
int* (*)(const int &);
但是:
int* (A::*)(const int&);
此外,您的代码表明设计非常糟糕 - 我认为您需要简单的虚函数。但如果你想继续这样写,你可能想阅读:ISOCPP: Pointers to members.
请记住,C
类型的非静态成员函数总是接受 C*
类型(或 const C*
类型的附加隐式参数,如果函数声明为 const
限定符),指向调用此函数的 C
实例。
如果我有两个这样的 类 :
class A
{
public:
int *(*fun)( const int &t );
A( int *( *f )( const int &t ) ) : fun( f ) {}
};
class B
{
private:
float r;
int *f(const int &t)
{
return new int( int( r ) + t );
}
A a;
B() : a( A( f ) ) {}
};
这会导致编译器错误。
我想将f
赋值给a
的函数指针。
问题是 A
可以被许多 类 使用,而不仅仅是 B
,所以我不能简单地将 fun
定义为 B::*fun
。
None 我在互联网上和 Whosebug 上找到的帖子解决了使用函数指针的问题,其中许多 类 每个都有自己的成员函数,但原型相同。
那怎么办?
So what to do
不多。除了在对象类型上模板化 A
之外,它将保存指向成员函数的指针,该成员函数引用 const int 并返回指向 int 的指针。
您要做的是将指向自由函数的指针与指向成员函数的指针混合。虽然听起来它们都是函数指针,但它们的不同之处足以使它们无法通过相同的类型定义。
您的代码看起来令人困惑,而且就我个人而言,我认为 C 函数指针 在 C++ 的 OO 实现 上看起来很难看。所以我建议你使用 std::function
。自 C++11
以来才可用。如果您不能使用它,请尝试查看 Boost's Implementation.
我可以举例说明如何使用 std::function
:
bool MyFunction(int i)
{
return i > 0;
}
std::function<bool(int)> funcPointer = MyFunction;
使用它您将大大提高代码的可靠性。针对你的问题,具体来说:
class A
{
public:
std::function<int*(const int&)> fun;
A(std::function<int*(const int&)> f) : fun(f) {}
};
class B
{
private:
float r;
int *f(const int &t)
{
return new int(int(r) + t);
}
A *a;
B()
{
std::function<int*(const int&)> tempFun = std::bind(&B::f, this, _1);
a = new A(tempFun);
}
};
您必须添加以下命名空间:
using namespace std::placeholders;
this result in compiler error
因为 f
是 A
的非静态成员函数返回 int*
,它接受对 int
的单个常量引用。这意味着,它的类型不是:
int* (*)(const int &);
但是:
int* (A::*)(const int&);
此外,您的代码表明设计非常糟糕 - 我认为您需要简单的虚函数。但如果你想继续这样写,你可能想阅读:ISOCPP: Pointers to members.
请记住,C
类型的非静态成员函数总是接受 C*
类型(或 const C*
类型的附加隐式参数,如果函数声明为 const
限定符),指向调用此函数的 C
实例。