我有很多類X
的實例,它們每個包含另一個類CB
(有時不止一個CB
)。 CB
類有一個函數指針,它將在某個事件(點擊,計時器等)之後被調用。傳遞一個非靜態成員函數作爲參數
這將是非常有用,如果我可以只通過一個實例成員函數當地CB
類實例(通過在這種情況下say()
功能),這樣一旦CB
觸發功能,它會修改的東西在自己的實例只。
實施例的示例代碼:
#include <iostream>
class CB {
void (*function)(void);
void init(void (*function)(void)) {
this->function = function;
}
};
class X {
private:
CB cb;
public:
void init() {
cb.init(&(this->say)); //<- Here's the problem
}
void say() {
std::cout << "Hello World!" << std::endl;
}
};
int main() {
X x;
x.init();
}
所以我的上述例子中由於失敗線17與錯誤:
no known conversion for argument 1 from ‘void (X::*)()’ to ‘void (*)()’
是否有可能以某種方式通過一個實例地方say()
功能實例CB
? CB
函數不能被修改,不幸的是會被其他類型的其他類型使用。
我讀過其他線程,這很可能是不可能的,除非say()
函數是static
或存在於類外(這意味着它不會訪問實例變量)。
是否有可能按照我擁有的方式工作?如果不是最常見的解決方案(這似乎是很多人會遇到的問題)?
你知道如何編寫構造函數嗎? –
當'CB'調用試圖修改其狀態的方法時,最好希望你的'X'實例仍然存在。 – CoryKramer
爲什麼你需要一個函數指針?改用虛擬功能(接口)。 –