如何处理函数指针问题?
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)
);
}
我正在实现一个普通的函数指针。
所以这是我要调用的函数:
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)
);
}