簡體   English   中英

傳遞指向成員函數的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM