C++ 将指向虚拟成员函数的指针作为参数传递给普通C函数
我需要您的帮助,因为我不知道如何实现以下目标(而且可能根本不可能实现): 假设我有一个类层次结构,如C++ 将指向虚拟成员函数的指针作为参数传递给普通C函数,c++,C++,我需要您的帮助,因为我不知道如何实现以下目标(而且可能根本不可能实现): 假设我有一个类层次结构,如 class Base { public : ..... virtual int fcn(unsigned, const double *, void *,unsigned, double)=0; .... }; class Derived_1:public Base { public : ..... int fcn(unsigned, const dou
class Base
{
public :
.....
virtual int fcn(unsigned, const double *, void *,unsigned, double)=0;
....
};
class Derived_1:public Base
{
public :
.....
int fcn(unsigned, const double *, void *,unsigned, double);
....
};
class Derived_2:public Base
{
public :
.....
int fcn(unsigned, const double *, void *,unsigned, double);
....
};
我需要对成员函数fcn进行积分,我想使用一个数值积分包(由S.G.Johnson编写,请参阅),它包括(除其他外)一个例程,定义为:
int h_cubature(unsigned fdim, integrand f, etc ..);
其中f表示指向要集成的函数的指针,“被积函数”是一个typedef:
typedef int (*integrand) (unsigned, const double *, void *,unsigned, double);
我要做的是向h_cuburation传递一个指向成员函数fcn的指针,我想集成它(而且是通过一个多态机制,即给定一个基类类型的指针),也就是说
int main()
{
Base* b;
Derived_1 d1;
b=&d1;
hcubature(2, b->fcn, ........); //<---I don't know how to pass b->fcn
....
不管我做了什么,都失败了。我看到的问题是,即使被积函数和fcn都有相同的签名和相同的返回类型,b->fcn是一个虚拟成员函数,而被积函数是一个C型普通函数
有人能告诉我如何将b->fcn指针传递到h_cubature(或者可能告诉我这是不可能的)吗
提前谢谢你 < P>不能将C++(非静态)成员函数传递给C函数指针(直观地,因为这些成员函数具有<代码> < /COD>作为隐式形式参数)。
但是,被积函数的第三种形式可能是任意指针。因此,将对象的地址传递给它,并用作被积函数
一些胶水外部“C”
或静态
函数:
static int my_integrand (unsigned i, const double *t, void *data,
unsigned j, double x)
{
Base* b = static_cast<Base*>data;
assert (b != nullptr);
return b->fcn(i,t,data,j,x);
}
static int my_被积函数(无符号i、常数double*t、void*data、,
无符号j,双x)
{
Base*b=静态数据;
断言(b!=nullptr);
返回b->fcn(i,t,data,j,x);
}
我猜您不需要将数据
传递到b->fcn
(这样您就可以在基
,Derived1
,Derived2
类中更正其签名…)
稍后使用
hcubauture(fdim,my_被积函数,&d1,
…。您试图将指向类成员函数的指针作为指向函数的参数传递。这是不兼容的。您不能将其作为常规C函数传递,也不能使用lambda或bind
如果您控制函数的void*
参数,即您提供的“魔法cookie”,则可以使用它实际包含Base*
指针,然后将其强制转换并从中调用虚拟函数
class Base
{
public:
virtual int fcn(unsigned, const double *,unsigned, double)=0; // no void * param
};
int BaseFcn( unsigned u1, const double * pd, void * pv unsigned u2, double d )
{
Base * base = static_cast< Base * >( pv );
return base->fnc( u1, pd, u2, d );
}
C
integrand
函数看起来像一个回调函数,带有void*
参数,可以存储到对象的地址。这个答案应该有助于指向成员函数的指针与指向非成员函数的指针不同,不能互换使用。例如,C函数如何知道哪个对象ct调用上的成员函数?如果不传递可用于调用该函数的实际对象,则不可能。对于普通c,这是不可能的。您可以传递指向普通函数(或静态成员函数)的指针。该函数必须创建或获取一个对象,并调用该对象的成员函数(无论是否为虚拟函数)。非常感谢,现在已经很清楚了!这也是我的问题(使用hCubase)和第三个参数(“void*data”)已经被用来传递数据-作为指向一个双精度数组的指针。它也可以用来传递对象的地址吗?
class Base
{
public:
virtual int fcn(unsigned, const double *,unsigned, double)=0; // no void * param
};
int BaseFcn( unsigned u1, const double * pd, void * pv unsigned u2, double d )
{
Base * base = static_cast< Base * >( pv );
return base->fnc( u1, pd, u2, d );
}
class Base
{
public:
virtual integrand fcn() const = 0;
};