我正在實作一個普通的函式指標。
所以這是我要呼叫的函式:
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);
}
我的實際問題是我的編譯器在函式 pEditpunktpEditFeldX
的這一行中強調了pEditAll(Dyncallback, pEditFeldX)該函式并向我顯示此錯誤:
嚴重性代碼描述專案檔案行抑制狀態錯誤 C3867 'Punkt2d::pEditFeldX':非標準語法;使用 '&' 創建指向成員的指標
嚴重性代碼描述專案檔案行抑制狀態錯誤(活動)E0167“WndDyn (Punkt2d:: )(WynDyn_callback Dyncallback)”型別的引數與“WndDyn ( )(WynDyn_callback)”型別的引數不兼容
uj5u.com熱心網友回復:
因為pEditFeldX是一個成員函式,你不能只呼叫pEditFeldX(Dyncallback). 您必須在某些 Punkt2d 物件上呼叫該函式,例如使用meinPunkt2d.pEditFeldX(Dyncallback).
如果您pEditFeldX(Dyncallback) 在 Punkt2d 類中撰寫,則意味著(*this).pEditFeldX(Dyncallback). 編譯器添加(*this).以節省一些輸入。
函式指標只指向一個函式。它不指向函式和物件。它指向pEditFeldX,不是meinPunkt2d.pEditFeldX。呼叫時必須指定 Punkt2d 物件。
要記住必須指定 Punkt2d,指向成員函式的函式指標宣告為 this:WndDyn* (Punkt2d::*func_Call)(WynDyn_callback)并呼叫 this:meinPunkt2d.*func_Call(Dyncallback);
如果函式指標是&pEditFeldXthenmeinPunkt2d.*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);
}
uj5u.com熱心網友回復:
首先,我要感謝@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)
);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480154.html
上一篇:智能指標的二叉搜索樹
