我有一个类,其中我需要一个可以为每个对象定义的函数。我希望能够在定义所述对象的 vector 时定义每个对象的特定功能。我对象的这些 vector 将构成库的一部分。这是我正在尝试做的一个不成功的例子:
#include <iostream>
#include <vector>
class FunctionEater {
public:
virtual double func() {}
FunctionEater(double (*Func)) {
func = Func; // Not sure of the correct syntax here
}
};
std::vector<FunctionEater> gorgers {
{
double () { // Not sure of the syntax here, or if there is even syntax to do this
double result = 0.794 * 739.775;
return result;
}
},
{
double () {
double temp1 = 0.794 * 739.775;
double result = temp1 + 0.62;
return result;
}
}
}
int main()
{
double snackCrumbs = gorgers[0].func();
double gorgePoop = gorgers[1].func();
std::cout << snackCrumbs << std::endl << gorgePoop << std::endl;
}
因此,我正在努力弄清楚或找到很多相关文档的两件事如下:
- 如何在定义gorgers[]的元素的同时定义函数
- 如何接受我作为 (*Func) 传递给构造函数的函数,并将其存储为 virtual double func()
我希望能够在对象定义中定义函数。我花了相当多的时间研究如何最好地编写我的对象 vector ,以及在这种情况下视觉上最容易使用的方式,似乎是在一个 block 中定义每个对象的各个方面,同时定义它们包含在 vector 中。
我承认,我也不知道在使用虚函数时 (*Func) 是否正确,但这是对我第一次尝试使用函数指针的改编。我也很乐意接受可能比我尝试使用的方法更好的替代建议。
提前感谢您提供的任何帮助,如有必要,我很乐意编辑或更新我的问题。
皮特
最佳答案
您想要的是您的语言更好的功能特性支持。幸运的是,您使用的是 C++!
在 c++11 之后,我们有了 lambda 和 std::function
表示运行时多态函数对象的对象。
lambda 是这样定义的:
auto yourSecondFunc = [](){
double temp1 = 0.794 * 739.775;
double result = temp1 + 0.62;
return result;
};
我一直很懒,在那里使用了 auto,但实际上,我们可以将它分配给 std::function
对象:
std::function<double()> yourSecondFunc = [](){
double temp1 = 0.794 * 739.775;
double result = temp1 + 0.62;
return result;
};
那个std::function<double()>
意思是,该函数不带参数并返回一个 double 值。但是请注意,lambda 的类型不是 std::function
。对象,但不是讨论它的地方。
因此,您可以存储 std::function<double()>
在你的FunctionEater
类:
class FunctionEater {
public:
std::function<double()> func;
FunctionEater(const std::function<double()>& f) {
func = f;
}
void callMe() { double res = func(); } // how a function object is used
};
然后,你的 vector 变成这样:
std::vector<FunctionEater> gorgers {
FunctionEater { []()
{
double result = 0.794 * 739.775;
return result;
}
},
FunctionEater { []()
{
double temp1 = 0.794 * 739.775;
double result = temp1 + 0.62;
return result;
}
}
};
还有你的main
?其实是一样的:
int main()
{
double snackCrumbs = gorgers[0].func();
double gorgePoop = gorgers[1].func();
std::cout << snackCrumbs << std::endl << gorgePoop << std::endl;
}
关于c++ - 在构造对象时定义成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36705611/