如何处理函数指针问题?

how to deal with a function pointer problem?

我正在实现一个普通的函数指针。

所以这是我要调用的函数:

  WndDyn* Punkt2d::pEditPunkt(WndInfo& wi, Int32 AnzSichtChar, Bool WithUnit, 
  const DecimalsConf& DecConf)
  {
     WynDyn_callback Dyncallback;
     Dyncallback.AnzSichtChar = AnzSichtChar;
     Dyncallback.WithUnit = WithUnit;
     Dyncallback.DecConf = DecConf;

     return &(DlgZeile(wi)
            + pEditAll(Dyncallback, &pEditFeldX)//pEditFeldX(AnzSichtChar, WithUnit, 
              DecConf)
            + FntXUnit(2)
            + pEditFeldY(AnzSichtChar, WithUnit, DecConf)
             );
   }

在定义了需要调用的函数后,我将我的被调用者定义如下:

WndDyn*   pEditAll(WynDyn_callback& Dyncallback, WndDyn* (func_Call) 
      (WynDyn_callback)) {
        return  func_Call(Dyncallback);
    }

最后是需要使用被调用函数调用的函数:

WndDyn* Punkt2d::pEditFeldX(WynDyn_callback Dyncallback) {

    return &Edit(pNewStrDataLink(m_x, DLUC_Length, Dyncallback.DecConf), 
                 Dyncallback.AnzSichtChar)
                 .WithSelAllOnFocus(True);
    }

我的实际问题是我的编译器强调了函数 pEditFeldX 在函数 pEditpunkt 的这一行 pEditAll(Dyncallback, pEditFeldX) 中并向我显示此错误:

Severity Code Description Project File Line Suppression State Error C3867 'Punkt2d::pEditFeldX': non-standard syntax; use '&' to create a pointer to member

Severity Code Description Project File Line Suppression State Error (active) E0167 argument of type "WndDyn (Punkt2d::)(WynDyn_callback Dyncallback)" is incompatible with parameter of type "WndDyn ()(WynDyn_callback)"

因为 pEditFeldX 是一个成员函数,您不能只调用 pEditFeldX(Dyncallback)。您必须在某些 Punkt2d 对象上调用该函数,例如使用meinPunkt2d.pEditFeldX(Dyncallback).

如果你在 Punkt2d class 中写 pEditFeldX(Dyncallback) 那么它的意思是 (*this).pEditFeldX(Dyncallback)。编译器添加 (*this). 以节省一些输入。

一个函数指针只指向一个函数。它不指向函数和对象。它指向 pEditFeldX,而不是 meinPunkt2d.pEditFeldX。调用时必须指定Punkt2d对象。

要记住必须指定 Punkt2d,指向成员函数的函数指针声明为:WndDyn* (Punkt2d::*func_Call)(WynDyn_callback) 并调用为:meinPunkt2d.*func_Call(Dyncallback);

如果函数指针是&pEditFeldX那么meinPunkt2d.*func_Call(Dyncallback)meinPunkt2d.pEditFeldX(Dyncallback)是一样的

这不适用于 static 成员函数。静态成员函数可以与普通函数指针一起使用,因为不需要对象。


不太清楚你要做什么,但如果我理解正确,我认为 std::function 可以解决你的问题 std::function 可以存储 任何可以被调用的东西,包括你似乎想要的“半个函数调用”。 std::bind 可以进行这些“半函数调用”。

您可以这样使用它们:

// in pEditPunkt
pEditAll(Dyncallback, std::bind(&CPunkt2d::pEditFeldX, this, std::placeholders::_1))

// in pEditAll
WndDyn*   pEditAll(WynDyn_callback& Dyncallback, std::function<WndDyn* (WynDyn_callback)> (func_Call) 
  (WynDyn_callback)) {
    return  func_Call(Dyncallback);
}

首先我要感谢@user253751 的耐心和大力支持。我想与您分享我的代码现在的样子:

#include <functional>
// pointer function
WndDyn*   pEditAll(WynDyn_callback& Dyncallback, std::function<WndDyn* 
            (K_WynDyn_callback)>func_Call) {
    return  func_Call(Dyncallback);
}

//the calle
 WndDyn* K_Punkt2d::pEditPunkt( WndInfo& wi, Int32 AnzSichtChar, 
 Bool WithUnit, const DecimalsConf& DecConf)
{
    WynDyn_callback Dyncallback;
    Dyncallback.AnzSichtChar = AnzSichtChar;
    Dyncallback.WithUnit = WithUnit;
    Dyncallback.DecConf = DecConf;
    
   return &(DlgZeile(wi)
                + pEditAll(Dyncallback, 
     std::bind(&Punkt2d::pEditFeldX, this, 
     std::placeholders::_1))//pEditFeldX(AnzSichtChar, WithUnit, 
      DecConf)
                + FntXUnit(2)
                + pEditFeldY(AnzSichtChar, WithUnit, DecConf)
              );
}