【问题标题】:function pointer for a member function成员函数的函数指针
【发布时间】:2012-09-20 14:08:56
【问题描述】:

希望有人能帮助解决这个问题:

我在一个类中有一个函数

class A
{
   void fcn1(double *p, double *hx, int m, int n, void *adata);
   void fcn2();
}

在 fcn2 内部,我尝试使用指向 fcn1 的指针,如下所示:

A::fcn2()
{
  void (*pfcn1)(double*, double*, int, int, void*) = fcn1;
} 

我得到一个错误:

错误 C3867:'A::fcn':函数调用缺少参数列表;使用 '&A::fcn' 创建指向成员的指针

这将是一种帮助的人。

谢谢

【问题讨论】:

  • 成员函数不是函数。想想看。你不能只调用一个成员函数。

标签: c++ visual-studio


【解决方案1】:

fcn1() 不是普通函数,而是成员函数。不能使用普通的函数指针来存储指向它的指针,因为这不能提供足够的信息:调用函数时应该将this 设置为什么?

您需要使用 member 函数指针:

void (A::*pfcn1)(double*, double*, int, int, void*) = &A::fcn1;

如果您有 a 类型的 A 对象,您可以稍后调用它:

(a.*pfcn1)(&somedouble, &somedouble, 42, 69, NULL);

如果您有一个指向A 类型对象的指针pa,您可以稍后使用:

(pa->*pfcn1)(&somedouble, &somedouble, 42, 69, NULL);

【讨论】:

  • 谢谢@MikeSeymour -- 没有意识到括号是必要的!
  • 谢谢迈克。我可以再澄清一点吗?我最终将这个 A::*pfcn1 用于一个函数 fcn3(void (*func)(double *p, double *hx, int m, int n, void *adata),/*has other arguments*/) 接受函数指针作为第一个参数。并按照您的示例,我试图将其作为 this->*pfcn1 作为第一个参数传递。但这正在崩溃。
  • @user1612986:恐怕你在问什么真的不清楚。 “我最终将这个 A::*pfcn1 用于函数 fcn3”是什么意思?
  • fcn3(void (*func)(double *p, double *hx, int m, int n, void *adata),/*has other arguments*/) 有这样的签名。它是一个接收函数指针的优化器。我有 A::fcn1(),我想将它作为第一个参数传递给优化器 fcn3()。我在 A::func2() 中执行的所有这些步骤。在 A::func2(){ 第一个 pfcn1 = &A::fcn1() 按照您的建议,然后我想将它传递给 fcn3(pfcn1,/*other arguments*/); }
  • @user1612986:谢谢,我现在明白了。不幸的是,这样做很尴尬:您基本上需要编写一个普通函数forward_to_fcn1(double *p, double *hx, int m, int n, void *adata) { get_the_right_A_object().fcn1(p, hx, m, n, adata); },并将一个指向那个函数的指针作为它的第一个参数传递给fcn3()
【解决方案2】:

改为:

void (A::*pfcn1)(double*, double*, int, int, void*) = &A::fcn1;

考虑使用typedef 以提高可读性:

class A
{
   ...
   typedef void (A::*fcn1_ptr)(double*, double*, int, int, void*);
};

void A::fcn2()
{
    fcn1_ptr pfcn1 = &A::fcn1;
}

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多