C++ c++;具有每个实例化对象的特定功能的结构(或类)
我需要实现一个结构(或类),其中每个实例都有一个指向特定函数的“指针”。这可能吗 大概是这样的:C++ c++;具有每个实例化对象的特定功能的结构(或类),c++,callback,function-pointers,C++,Callback,Function Pointers,我需要实现一个结构(或类),其中每个实例都有一个指向特定函数的“指针”。这可能吗 大概是这样的: struct constrain{ string name; int direction; double evaluate (vector <double> &x_var); }; struct constrain{ string
struct constrain{
string name;
int direction;
double evaluate (vector <double> &x_var);
};
struct constrain{
string name;
int direction;
double (*evaluate) (vector <double> &x_var);
};
struct约束{
字符串名;
int方向;
双重评估(向量&x_-var);
};
其中evaluate“指向”一个特定函数,这样当我创建约束对象时,我就可以知道对象方法evaluate应该指向哪个函数,并且当我以后使用它时(例如,我的约束对象将包含在std::vector中),我就可以调用特定函数。是的,这是可能的。您需要稍微更改您的定义:
struct constrain{
string name;
int direction;
double (*evaluate)(vector <double> x_var);
};
struct约束{
字符串名;
int方向;
双(*评估)(向量x_var);
};
然而,这是一个有点C-ish的方法。由于您使用C++,所以可以使用函数对象(重载<代码>操作程序)(< /代码>)。< /p> < p>创建函数中的一个参数为指针:
constraint::constraint (double (*pFn)(vector <double> x_var))
{
this->evaluate = pFn
}
constraint::constraint(双(*pFn)(向量x_var))
{
此->评估=pFn
}
同样在标题中正确:
double (*evaluate) (vector <double> x_var);
double(*评估)(向量x_var);
可以使用指向函数或函子的指针(例如来自boost的指针)
试着这样做:
struct constrain{
string name;
int direction;
double evaluate (vector <double> &x_var);
};
struct constrain{
string name;
int direction;
double (*evaluate) (vector <double> &x_var);
};
struct约束{
字符串名;
int方向;
双(*评估)(向量和x_变量);
};
或
struct约束{
字符串名;
int方向;
功能评估;
};
请注意,这不会有任何指向调用它的“对象”的指针,因此您必须添加适当的参数(为了方便起见,可能需要键入def):
struct约束{
typedef double(*callback_t)(约束*对象、向量和x_变量);
字符串名;
int方向;
回拨评估;
//辅助函数
双重评估(向量和x_变量){
返回evaluate_f(this,x_var);
}
};
检查使用情况
如果使用
boost::function
和boost::bind
(或std:*
等价物,如果使用C++11编译器):考虑使用std::function
:
struct Foo
{
std::function<double (std::vector<double>)> func;
};
如果您的代码> STL< /Cult>实现没有<代码> STD::函数< /> >考虑使用<代码> Boo::函数< />代码> < P>
我们确实有指向函数的指针
一旦创建了这样一个指针,就可以用函数的地址来实例化它
范例
void my_int_func(int x)
{
printf( "%d\n", x );
}
int main()
{
void (*foo)(int); // this is a pointer to a function
foo = &my_int_func;
return 0;
}
类似地,您可以使用结构成员指针作为函数
的指针,它是否需要访问<代码>这个< /代码>指针?使用引用来传递<代码> xyava>代码>,并且考虑通过向量传递值可能不是正确的事情。@ PMR:你是对的,但问题是向量是如何传递的,你假设他的编译器(或STL实现)已经有了这些。这完全是针对OP的。我相信这将成为公认的答案。您可能需要添加一段关于运行时/编译时之间差异的内容,并将其扩展为使用模板和函子。我的第一个问题是stackoverflow。。印象深刻!谢谢,我将尝试以下实现:-)(我在MinGW上使用g++4.6和4.4)void my_int_func(int x)
{
printf( "%d\n", x );
}
int main()
{
void (*foo)(int); // this is a pointer to a function
foo = &my_int_func;
return 0;
}