C++:是否可以将方法分配给同一个 class 中的函数指针成员(属性)?
C++: Is it posible to asign a method to a function-pointer-member (atribute) in the same class?
这就是我想要做的:我有一个 class 成员(属性),它是一个函数指针。在创建者中,我想将相同 class 的一些方法分配给该指针(取决于某些条件),然后在其他方法中使用它。例如:
class monton
{
private:
protected:
bool (*comparador)(int a, int b);
inline bool mayor(int a, int b) {return a > b;}
inline bool menor(int a, int b) {return a < b;}
...
public:
monton (bool maximo = true)
{
if(maximo) comparador = mayor;
else comparador = menor;
}
...
};
当我在 CodeBlocks 中编译此代码时,出现此错误:
error: cannot convert ‘monton::mayor’ from type ‘bool (monton::)(int, int)’ to type ‘bool (*)(int, int)’|
此错误告诉您您正在尝试将指向非静态成员函数的指针分配给常规函数指针类型的变量。正确的指针声明是:
bool (monton::*comparador)(int a, int b);
// or even better with type alias
using t_ComparadorPointer = bool (monton::*)(int a, int b);
t_ComparadorPointer comparador;
另一种解决方案。你必须让比较静态。
#include <functional>
class Monton
{
static std::function<bool(int, int)> comparador;
static inline bool mayor(int a, int b) { return a > b; };
static inline bool menor(int a, int b) { return a < b; };
public:
Monton(bool maximo)
{
comparador = mayor;
if(!maximo) comparador = menor;
};
};
std::function<bool(int, int)> Monton::comparador;
int main()
{
Monton monton(1);
return 0;
}
这就是我想要做的:我有一个 class 成员(属性),它是一个函数指针。在创建者中,我想将相同 class 的一些方法分配给该指针(取决于某些条件),然后在其他方法中使用它。例如:
class monton
{
private:
protected:
bool (*comparador)(int a, int b);
inline bool mayor(int a, int b) {return a > b;}
inline bool menor(int a, int b) {return a < b;}
...
public:
monton (bool maximo = true)
{
if(maximo) comparador = mayor;
else comparador = menor;
}
...
};
当我在 CodeBlocks 中编译此代码时,出现此错误:
error: cannot convert ‘monton::mayor’ from type ‘bool (monton::)(int, int)’ to type ‘bool (*)(int, int)’|
此错误告诉您您正在尝试将指向非静态成员函数的指针分配给常规函数指针类型的变量。正确的指针声明是:
bool (monton::*comparador)(int a, int b);
// or even better with type alias
using t_ComparadorPointer = bool (monton::*)(int a, int b);
t_ComparadorPointer comparador;
另一种解决方案。你必须让比较静态。
#include <functional>
class Monton
{
static std::function<bool(int, int)> comparador;
static inline bool mayor(int a, int b) { return a > b; };
static inline bool menor(int a, int b) { return a < b; };
public:
Monton(bool maximo)
{
comparador = mayor;
if(!maximo) comparador = menor;
};
};
std::function<bool(int, int)> Monton::comparador;
int main()
{
Monton monton(1);
return 0;
}