2012-01-25 5 views
4

私のプログラムでは、main()を入力する前に割り当てたいクラスがあります。私は別のモジュールでこれらを取り除き、自分のコードから混乱を避けたいと思います。しかし、モジュールがスコープから外れると(main()が入る前に)、オブジェクトは割り当てが解除され、mainにnull参照を使用しようとしています。短い例:静的初期化と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; 
    } 
} 

C++とJavaでクラスとは対照的に、私はまだ、カプセル化の基本単位であるモジュールの概念に慣れますよ。これはDで行うことができますか、または私はメインモジュールに私の初期化を移動する必要がありますか?ここで

+1

コードは機能します。あなたの問題はおそらく他の場所にあります。 –

答えて

4

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

"スタート" 世界1をシャドウローカルスコープの変数です。グローバルなものは初期化されていません。

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

プログラムは、これ以上のクラッシュした:私はこれを変更しなかった後 。

+1

ああ、それです。そのような些細な経過がいかにそのような迷惑なエラーを引き起こすかという面白い。グローバル化が悪いのはこのためだと思います。 – Meta

+0

おそらくローカル変数を持つグローバル変数をシャドーイングする場合に警告を発行するための強化要求を提出する価値があります。しかし、これが良い考えであるかどうかは分かりません。 –

+2

グローバル変数のシャドーイングを許可するのが目的です。インポートしたモジュールには、ローカル変数の1つと同じ名前の新しいグローバル変数が追加されているため、コードブレークは不要です。シャドウ変数に特別にアクセスしたい場合は、 '.'を付けてください。 –

関連する問題