[英]To pass a pointer to a member function
我有一個具有實例函數(或方法?)的類。 在一個實例中,我嘗試將指向這些函數的指針傳遞給庫。 該庫需要靜態函數。
當我將指針傳遞給回調函數時,編譯器會抱怨我的函數不是靜態的。 我試圖將它們設為靜態,但如果我這樣做,那么我就無法從函數中訪問實例字段。
我怎么能繞過這個?
類似的問題是: 使用C ++類成員函數作為C回調函數 ,他們建議將方法設置為靜態。 但是我做不到,或者我不知道我怎么做。
GlutController::GlutController (int argc, char **argv) {
// stuff ..
// Register callbacks
glutSpecialFunc( OnSpecialKeys ); // Error, need static functions
glutReshapeFunc( OnChangeSize ); // Error...
glutDisplayFunc( OnRenderScene ); // Error...
// stuff ..
}
GlutController::~GlutController() {
}
void GlutController::OnChangeSize(int aNewWidth, int aNewHeight){
glViewport(0,0,aNewWidth, aNewHeight);
mViewFrustrum.SetPerspective( APP_CAMERA_FOV, // If this function is
float( aNewWidth ) / float( aNewHeight ), // static, this won't
APP_CAMERA_NEAR, // work
APP_CAMERA_FAR );
mProjectionMatrixStack.LoadMatrix( // Same here
mViewFrustrum.GetProjectionMatrix() );
mTransformPipeline.SetMatrixStacks(mModelViewMatrixStack, // Same here
mProjectionMatrixStack);
}
void GlutController::OnRenderScene(void){
mGeometryContainer.draw(); // Won't work if static
}
void GlutController::OnSpecialKeys(int key, int x, int y){
mGeometryContainer.updateKeys(key); // Won't work if static
}
免責聲明:我剛開始使用C ++。 我閱讀了所有Accelerated C ++,這是我嘗試該語言的第一個項目。 我的背景是Java。
你想要做的是不可能的。 實際上這是glut
的錯。
事情是這樣的:
glut
想要調用函數而不給它數據, 這是相互沖突的需求。 我相信glut
決定你可以安全地使用全局變量。
因此,一種解決方案是使用靜態函數和靜態數據 。 或者更好的解決方案是切換到SDL 。
總之,你不能。 C ++成員函數實際上是“鏈接”到對象的實例。 在較低級別,它們有一個額外的參數,實際上是指向此對象實例的指針。
所以,你必須使用靜態函數,並且,由於過剩不允許你傳遞一個可以識別當前實例的參數,你將不得不想出一些解決方法。 最簡單的解決方法是使用靜態成員。 如果你的GlutController是單身(我覺得它是),你會沒事的。
使用指向GlutInstance的文件范圍靜態變量是可能的,顯然是安全的(靜態函數+靜態數據,如另一個答案中所述)。
static GlutController* s_this;
static void s_OnChangeSize(int w, int h) { s_this->OnChangeSize(w, h); }
GlutController::GlutController (int argc, char **argv) {
s_this = this;
glutSpecialFunc(s_OnSpecialKeys);
}
GlutController::~GlutController() { s_this= 0; }
void GlutController::OnChangeSize(int w, int h) { /* non-static stuff */ }
s_this
僅在本地文件中可見,例如,對於從另一個文件調用GlutController構造函數的任何代碼都不可見。
你應該有一個static method
和一個instance
(可能是靜態的)從static
函數調用instance
的成員函數
像這樣的東西:
//static method
void MyClass::myCallback()
{
static MyClass instance; //or you can store your in instance in some Singleton, or
//possibly create a temporary
instance.nonStaticMethod();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.