我有一個帶有實例函數(或方法?)的類。從一個實例中,我嘗試將指向這些函數的指針傳遞給一個庫。該庫期望靜態功能。將指針傳遞給成員函數
當我將指針傳遞給回調函數時,編譯器會抱怨我的函數不是靜態的。我試圖讓它們變成靜態的,但如果我這樣做了,那麼我無法從函數內部訪問實例字段。
我怎麼能解決這個問題?
類似的問題是:Using a C++ class member function as a C callback function他們建議靜態的方法。但是我做不到,或者我看不到我能做到。
代碼
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++。我閱讀了所有加速C++,這是我第一個嘗試使用該語言的項目。我的背景是Java。
我對glut的瞭解不多,但它聽起來像是需要一些可調用的東西,它不包含任何參數(包含隱含的參數)。所以不會有一個適當構建的'std :: function'能做到這一點嗎? – juanchopanza 2012-08-03 09:31:44
任何開發不透明的庫函數,不能接受用戶定義的參數(例如用於回調)的人都應該被解僱,晉升爲營銷/銷售,或者獲得經濟刺激去爲競爭對手公司工作。 – 2012-08-03 09:58:57
@Shahbaz我正在嘗試做一個簡單的演示,並且我認爲在模板代碼方面,與SDL相比,過度使用非常簡單。另外,我正在使用「OpenGL SuperBible」這本書來指導我。 我認爲使用static/global將是不可避免的,或者像Nick在他的回答中所說的那樣使用Singleton。 – AntoineG 2012-08-03 12:15:21