我需要從同一個類的靜態成員函數中調用非靜態成員函數。 靜態函數是一個回調函數。它可以只接收無效的數據,雖然我通過一個char *。所以我不能直接向回調提供類實例。我可以將結構而不是char傳遞給回調函數。任何人都可以給例如代碼在靜態成員函數中使用非靜態成員函數。並使用靜態成員函數中的結構來使用該類的實例來調用非靜態成員函數?如何從靜態成員函數中調用非靜態成員函數而不通過類實例
4
A
回答
5
通常這樣的回調應該是這樣的:
void Callback(void* data)
{
CMyClass *myClassInstance = static_cast<CMyClass *>(data);
myClassInstance->MyInstanceMethod();
}
當然,你需要確保,數據點的類的實例。例如。
CMyClass* data = new CMyClass();
FunctionCallingMyCallback(data, &Callback);
delete data;
現在,如果我正確理解你,你還需要傳遞一個char *。 您可以在一個結構包裹都和解開它的回調,像這樣:
MyStruct* data = new MyStruct();
data->PtrToMyClass = new CMyClass();
data->MyCharPtr = "test";
FunctionCallingMyCallback(data, &Callback);
delete data->PtrToMyClass;
delete data;
void Callback(void* data)
{
MyStruct *myStructInstance = static_cast<MyStruct *>(data);
CMyClass *myClassInstance = myStructInstance->PtrToMyClass;
char * myData = myStructInstance->MyCharPtr;
myClassInstance->MyInstanceMethod(myData);
}
,或者如果可以修改CMyClass的定義,把類成員的所有必要的數據,這樣就可以使用如第一個例子中的回調。
0
這是唯一的出路:
#include <iostream>
#include <cassert>
struct A;
A *oneObj = NULL;
struct A
{
A(){
oneObj=this;
}
~A(){
oneObj=NULL;
}
void foo()
{
}
static void boo()
{
assert(NULL != oneObj);
oneObj->foo();
}
};
int main()
{
A onlyOne;
A::boo();
}
4
如果您的實例是單身,你可以做(通常是使用私有或受保護的構造和靜態指針本身實現的),例如:
class MyClass {
private:
MyClass():myInstance(0) {}
MyClass *myInstance;
void callback();
public:
~MyClass() {}
static MyClass *getInstance();
static void myCallback();
};
MyClass *MyClass::getInstance() {
if(!myInstance) {
myInstance = new MyClass;
}
return myInsance;
}
void MyClass::callback() {
// non-static callback
}
void MyClass::myCallback() {
getInstance()->callback();
}
如果你不使用單例,但你可以將實例轉換爲void *
,那麼你可以這樣做:
void MyClass::myCallback(void *data) {
MyClass *instance = static_cast<MyClass *>(data);
instance->callback();
}
0
我需要從同一
class
的靜態成員函數 調用非static
成員函數。static
函數是一個回調函數。它可以 只接收無效的數據,雖然我通過char*
。
這表明本設計是有缺陷的或inproper。恕我直言,你應該考慮改變設計。試想一下,如果你以某種方式獲得工作,但可維護性和代碼的可讀性如何呢?
我建議你應該改變你的回調函數到不同的簽名,並根據變化。
class A {
//...
static void CallBack (A *pObj)
{
// logic
}
};
相關問題
- 1. 如何從靜態成員函數中調用非靜態成員函數?
- 2. 靜態成員函數指針保存非靜態成員函數
- 3. 靜態成員變量可以調用非靜態成員函數嗎?
- 4. C++:成員調用非靜態成員函數指針
- 5. _beginthreadex靜態成員函數
- 6. Const靜態成員函數
- 7. 靜態線程函數訪問非靜態類成員在C++
- 8. 使用靜態成員函數而不是等效的非靜態成員函數的優點?
- 9. 如何從靜態成員函數調用指向成員函數的指針?
- 10. 什麼是非靜態成員函數?
- 11. 如何從類成員函數內部訪問靜態函數?
- 12. 調用不帶對象參數的非靜態成員函數
- 13. 調用非靜態成員函數,而無需創建一個實例
- 14. 如何調用靜態函數,如成員函數
- 15. '靜態'的C++類成員函數?
- 16. 如何定義靜態成員函數?
- 17. 何時使用靜態成員函數?
- 18. C++改變從靜態成員函數
- 19. Form實例成員和靜態成員
- 20. 如何從成員函數中設置類靜態數據成員的值?
- 21. 非法調用非靜態成員函數(C++)?
- 22. C#靜態類 - 靜態類不能有非靜態成員
- 23. 通過非靜態成員函數指針在C++
- 24. 通過靜態成員函數初始化C++中的非常量靜態成員變量
- 25. Python中的函數的靜態成員?
- 26. 在比較函數中使用非靜態類成員
- 27. 從WndProc調用非靜態成員
- 28. Qt:必須調用對非靜態成員函數的引用
- 29. stringcomp:必須調用非靜態成員函數的引用
- 30. 隱藏實現成員函數(如靜態全局函數)的
好的答案 - +1 - 但你不應該使用C風格的演員恕我直言。 – sje397
@ sje397 - 同意,但是這是SO,每秒都在計數。將編輯... – Henrik
感謝亨裏克它的工作。我之前嘗試過同樣的事情,除了我爲該結構創建了一個指針。 – HariHaraSudhan