C++ 调用函数指针的向量

C++ 调用函数指针的向量,c++,function,pointers,C++,Function,Pointers,我尝试使用C++中函数指针的向量,它属于一个类,在另一个类中调用。例如:在类BoundaryCondition(文件BoundaryCondition.h)中,我将函数指针初始化为: class BoundaryConditions{ public: // Constructor function BoundaryConditions(int id = 0); vector <void (BoundaryConditions::*) (Face &, i

我尝试使用C++中函数指针的向量,它属于一个类,在另一个类中调用。例如:在类BoundaryCondition(文件BoundaryCondition.h)中,我将函数指针初始化为:

class BoundaryConditions{

public:
// Constructor function
BoundaryConditions(int id = 0);             
vector <void (BoundaryConditions::*) (Face &, int, int)> func2bcond;                

void fixedValue(Face &face, int id, int rkStep);
// and other functions with similar definition as fixedValue
}
this->bcond[i].func2bcond.resize(totNoOfVariable);
并使用new(在DG.cpp文件中)将内存分配给bcond变量。对于每个bcond[i]实例,我需要将内存分配给函数指针,如下所示:

class BoundaryConditions{

public:
// Constructor function
BoundaryConditions(int id = 0);             
vector <void (BoundaryConditions::*) (Face &, int, int)> func2bcond;                

void fixedValue(Face &face, int id, int rkStep);
// and other functions with similar definition as fixedValue
}
this->bcond[i].func2bcond.resize(totNoOfVariable);
我使用的是resize而不是pushback,因为文件读取的顺序可能不符合要求。接下来,根据我的边界条件文件,我将函数分配给这个函数指针(同样在DG.cpp中):

bcond[i].func2bcond[j] = (&BoundaryConditions::fixedValue);
到目前为止,代码编译得还不错。我试图调用这些函数时出错。我称之为DG.cpp。代码如下:

(bcond[i].*func2bond[j])(f,1,2);
我不断得到以下错误:

 error: 'func2bcond' was not declared in this scope
我很确定这只是*或括号的位置问题,但我被困在这里,我没有得到任何关于stackoverflow的具体解决帖子


提前感谢

调用方法上的指针时需要实例,所以您的代码可能如下所示:

(bcond[i].*(bcond[i].func2bond[j]))(f, 1, 2);
或者,拆分表达式:

auto methodPtr = bcond[i].func2bond[j]; // auto is `void (BoundaryConditions::*) (Face &, int, int)`
(bcond[i].*methodPtr)(f, 1, 2);

它应该是
(*(bcond[i].func2bond[j])(f,1,2)或者,也可以使用std::invoke,请首先提供一个。其次,在现代C++中,使用裸C数组来存储数据是一个坏主意,有一些替代方案可以帮助您避免跟踪许多讨厌的bug。为什么不使用
std::vector
而不是数组?第三,
fixedValue
是一个成员函数。如果要存储指向该函数的指针,还必须说明应该调用该函数的对象:。您可以使用
std::bind
或-better-lambda表达式来实现这一点。“我初始化一个BoundaryCondition实例数组,类似于:BoundaryCondition*bcond;”--这不会初始化任何东西您有指向成员函数的指针,所以您需要有指向调用这些函数的对象的指针:
(&bcond[i] ->*(bcond[i].func2bcond[j])(f,1,2);
(bcond[i].*(bcond[i].func2bcond[j])(f,1,2);
。效果很好。谢谢伙计!不过,我想知道为什么(写两次bcond)会起作用?你能详细解释一下吗。我希望第二个代码片段在这方面足够清楚:/你基本上可以看到
void(C:*m)()
as
void(*f)(C&)
(方法调用中的额外
this
)。您需要
bcond
两倍于其中存储的方法指针,并且您希望将该方法应用于实例
bcond[i]
。如果额外的参数也是成员,您甚至可能会重复更多:
(bcond[i].-methodPtr)(bcond[i].face,bcond[i].id,bcond[i] .rkStep);