2012-01-25 2 views
4

내 프로그램에서 main() 입력하기 전에 할당 할 클래스가 있습니다. 나는 내 코드에서 혼란을 피하기 위해 이것을 별도의 모듈에 넣어두고 싶다; 그러나 main()이 입력되기 전에 모듈이 범위를 벗어나 자마자 객체가 할당 해제되어 main에서 null 참조를 사용하려고합니다. 짧은 예 : C++ 및 Java의 클래스에 반대정적 초기화 및 D 별도의 모듈에서 클래스의 사용

// main.d 

import SceneData; 

int main(string[] argv) 
{ 
    start.onSceneEnter(); 

    readln(); 
    return 0; 
} 

// SceneData.d 

import Scene; 

public 
{ 
    Scene start; 
} 

static this() 
{ 
    Scene start = new Scene("start", "test", "test"; 
} 

// Scene.d 

import std.stdio; 

class Scene 
{ 
    public 
    { 
     this(string name) 
     { 
      this.name = name; 
     } 

    this(string name, string descriptionOnEnter, string descriptionOnConnect) 
    { 
     this.name = name; 
     this.descriptionOnEnter = descriptionOnEnter; 
     this.descriptionOnConnect = descriptionOnConnect; 
    } 

     void onSceneEnter() 
     { 
      writeln(name); 
      writeln(descriptionOnEnter); 
     } 
    } 

    private 
    { 
     string name; 
     string descriptionOnEnter; 
     string descriptionOnConnect; 
    } 
} 

나는 아직도, 캡슐화의 기본 단위 인 모듈의 개념에 익숙해 있어요. 이것이 D에서 할 수 있습니까? 아니면 메인 모듈로 초기화해야합니까? 여기

+1

코드가 작동합니다. 문제는 다른 곳에서 발생할 가능성이 큽니다. –

답변

4

:

static this() 
{ 
    Scene start = new Scene("start", "test", "test"); 
} 

"시작"글로벌 한 그림자 지역 범위의 변수이다. 글로벌 하나가 초기화되지 않았습니다. 변경 후 :

static this() 
{ 
    start = new Scene("start", "test", "test"); 
} 

프로그램이 더 이상 충돌하지 않습니다.

+1

아, 그게 다예요. 그러한 비합리적인 경과가 어떻게 그런 성가신 실수를 유발할 수 있는지 재미 있습니다. 이것이 세계화가 나쁜 이유라고 생각합니다. – Meta

+0

로컬 변수를 사용하여 전역 변수를 섀도 잉하는 경우 경고를 발행하는 개선 요청을 제출하는 것이 좋습니다. 그래도 이것이 좋은 생각인지 전혀 모르겠다. –

+2

글로벌 변수의 섀도 잉을 허용하는 것이 목적입니다. 가져온 모듈이 로컬 변수 중 하나와 동일한 이름을 가진 새로운 전역 변수를 추가했기 때문에 코드 중단을 원하지 않을 것입니다. 그림자 변수에 특별히 접근하고 싶다면'.' 접두사를 붙이십시오. –

관련 문제