2013-10-22 43 views
0

我有一個類與靜態變量。因爲我需要一個構造函數,是不是默認的,我開始有點困惑,但我希望我做得很好靜態C++變量,沒有默認構造函數,失去了值

class Object3D{ 

    public: 
     static Object3D ObjControl; 

     Object3D(); //this is here just for the initialization of the static variable 

     Object3D(Triangle *mesh); 

     Triangle *mesh; 

}; 

在這一點上我需要創建一個Object3D和我做如下

bool Engine::OnInit() { 

    if(SDL_Init(SDL_INIT_EVERYTHING) < 0) { 
      return false; 
     } 

     if((Surf_Display = SDL_SetVideoMode(WIDTH, HEIGTH, BBP, FLAGS)) == NULL) { 
      return false; 
     } 

     arma::colvec::fixed<3> upDirection; 
     upDirection << 0 << 1 << 0; 

     Camera cam(0.0, 0.0, 10.0, 10.0, 200.0, 90.0, upDirection); 
     Camera::CameraControl = cam; 

     arma::colvec::fixed<3> vertexA; 
     vertexA << -1 << 1 << 0; 

     arma::colvec::fixed<3> vertexB; 
     vertexB << 1 << 1 << 0; 

     arma::colvec::fixed<3> vertexC; 
     vertexC << 0 << -1 << 0; 

     Triangle tri(vertexA, vertexB, vertexC); 
     Triangle mesh[1]; 
     mesh[0] = tri; 
     Object3D obj(mesh); 

     Object3D::ObjControl = obj; // PROBLEM! -> when the function extis from the OnInit ObjControl doesn't have anything inside.. it is like cleaned at the exit 


     return true; 
    } 

問題是在返回之前插入註釋中的問題。

然後當我需要將該對象傳遞給渲染函數時,如下所示;在應用程序關閉,因爲我試圖訪問未初始化

void Engine::OnRender(){ 

    Rendering.WfRender(Object3D::ObjControl, Surf_Display, 1); 

} 

我覺得我做錯了什麼與靜態變量的存儲位置,但我做了一個攝像頭類的靜態變量相同,正如你可以在Engine :: OnInit中看到的,那裏一切正常。所以我不知道發生了什麼事情。

回答

0
  • 您的Object3D類只保留指向網格的指針或獲取其副本嗎?
  • 它是否實現了深拷貝複製構造函數?

我問,因爲你的mesh是走出去的範圍被分配到obj後,和obj被分配到靜態變量後走出去的範圍。您需要在堆上分配網格並將該指針傳遞給靜態變量,或者通過正確實現正確的構造函數確保實際數據被複制。

編輯:或者,因爲這看起來像遊戲開發,讓它做到快速和噁心! ;-)

Object3D::ObjControl.mesh = new Triangle(vertexA, vertexB, vertexC); 

...而失去局部變量trimeshobj

+0

是的,是的。我將線框渲染編碼爲賦值。感謝您提供最後的建議。無論如何是的,我必須更多地關注動態分配內存和範圍內容 – KKyK

+0

好的,我已經修復了它。我沒有意識到靜態變量的一些問題。我正在初始化它,但沒有按照它應有的方式使用它。無論如何現在它是好的。感謝您的辛勤工作! 總是很高興張貼在這裏! :) – KKyK

1

程序中的主要問題是你在你的函數中創建了一個三角形實例(網格),並且你傳遞了一個指向你的靜態成員變量ObjControl的指針。當你離開函數時,mesh將不再可用,所以ObjControl指向一個無效的實例。這可以通過在Object3D中存儲實際的三角形而不是指向三角形的指針來解決,或者在需要更多的時候存儲三角形的容器。

+0

我需要嘗試這個,但你說的應該是我的問題。我會盡快通知你! – KKyK