2013-10-22 4 views
0

정적 변수가있는 클래스가 있습니다. 나는 기본이 아닌 생성자를 필요로하기 때문에, 나는 조금 혼란 받고 있어요,하지만 난 내가 Object3D와 I를 만들 필요가 나는이 시점에서 잘기본 생성자가없는 정적 C++ 변수는 값을 잃습니다.

클래스

class Object3D{ 

    public: 
     static Object3D ObjControl; 

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

     Object3D(Triangle *mesh); 

     Triangle *mesh; 

}; 

을했다 희망 다음과 같이하십시오.

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 클래스는 메시의 포인터 만 잡고 있거나 복사본을 가지고 있습니까?
  • 딥 복사본 복사 생성자를 구현합니까?

나는 당신의 meshobj에 할당 된 후 범위를 벗어난 것입니다, 그리고 obj 정적 변수에 할당 된 후 범위를 벗어난 것입니다 때문에 부탁드립니다. 힙에 메시를 할당하고 해당 포인터를 정적 변수에 전달하거나 올바른 생성자를 올바르게 구현하여 실제 데이터를 복사해야합니다.

편집 : 또는 게임 개발처럼 보이지만 빠르고 재밌습니다. ;-)

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

... 그리고 로컬 변수를 잃게 tri, meshobj.

+0

예, 그렇습니다. 할당으로 와이어 프레임 렌더링을 코딩하고 있습니다. 마지막 제안에 감사드립니다. 어쨌든 예, 동적 할당 메모리와 스코프 물건에 조금 더 집중해야합니다. – KKyK

+0

그래, 고쳐주었습니다. 정적 변수에 대해 뭔가를 깨닫지 못했습니다. 나는 초기화하고 있었지만 그것이 예정되어있는 방식으로 사용하지는 않았다. 어쨌든 이제는 괜찮습니다. 노력해 주셔서 감사합니다! 항상 여기에 게시하게되어 기쁩니다! :) – KKyK

1

프로그램의 주요 문제는 함수에서 삼각형 인스턴스 (메쉬)를 만들고 정적 멤버 변수 ObjControl에 대한 포인터를 전달한다는 것입니다. 함수를 떠날 때 메쉬는 더 이상 사용할 수 없기 때문에 ObjControl은 잘못된 인스턴스를 가리 킵니다. Object3D의 삼각형에 대한 포인터 대신 포인터의 실제 삼각형을 저장하거나 더 필요할 경우 삼각형의 컨테이너를 저장하여 해결할 수 있습니다.

+0

나는 이것을 시험 할 필요가있다. 그러나 당신이 말하는 것은 내 문제이다. 최대한 빨리 알려 드리겠습니다. – KKyK