4

私のプログラムには、main() に入る前に割り当てたいクラスがあります。これらを別のモジュールに隠して、コードが煩雑にならないようにしたいと思います。ただし、モジュールがスコープ外になるとすぐに (main() に入る前に)、オブジェクトの割り当てが解除されるため、main で null 参照を使用しようとします。簡単な例:

// 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 で行うことは可能ですか、それとも初期化をメイン モジュールに移動する必要がありますか?

4

1 に答える 1

4

ここ:

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

「start」は、グローバルスコープ変数をシャドウイングするローカルスコープ変数です。グローバルなものは初期化されていません。これを次のように変更した後:

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

プログラムはもうクラッシュしませんでした。

于 2012-01-25T19:10:45.580 に答える