正如您在我的代碼中看到的那樣,我正在嘗試為onClick呼叫另一個類中的函式的按鈕創建一個事件(我正在嘗試創建自定義按鈕類而不是使用win32默認按鈕類進行測驗)。
但即使這不會引發任何錯誤,它也不會呼叫給定的方法。
這是Button.hpp 中的函式簽名
void onClick(POINT pt, void (ButtonsHandler::*clicked)(void));
這是里面的實作Button.cpp(clicked()在明顯呼叫的括號前使用throws C 運算式必須具有指向函式型別的指標)
void Button::onClick(POINT pt, void (ButtonsHandler::*clicked)(void))
{
if (PtInRect(&textRect, pt) != 0)
{
clicked;
}
}
這就是我真正稱呼它的地方
mainMenu.getPlay().onClick(pt, &ButtonsHandler::onPlay);
編輯:解決了謝謝你們我只是沒有創建一個 ButtonsHandler 物件來執行非靜態函式這是我缺少的正確代碼。
void Button::onClick(POINT pt, void (ButtonsHandler::*clicked)(void)) {
if (PtInRect(&textRect, pt) != 0) {
ButtonsHandler bh;
(bh.*clicked)();
}
}
uj5u.com熱心網友回復:
它只是不呼叫給定的方法!
必須呼叫傳遞給成員函式的指標才能生效。
我假設Button是從ButtonsHandler. 然后,例如,您可以使用指標呼叫成員函式的this指標,如下所示:
void Button::onClick(POINT pt, void (ButtonsHandler::*clicked)(void))
{
if (PtInRect(&textRect, pt) != 0) {
(this->*clicked)();
//^^^^^^^^^^^^^^^^^^
// or
// std::invoke(clicked, this) // need to include <functional> header(Since C 17)
}
}
如果兩個類都不相關,則需要一個 的實體ButtonsHandler來呼叫成員函式。例如:
ButtonsHandler obj;
(obj.*clicked)();
// or
// std::invoke(clicked, obj) // need to include <functional> header
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/337516.html
上一篇:場景的類設計:繼承與列舉
下一篇:抽象類可以是子類嗎?
