4

在我的程序中,我有一个要在进入 main() 之前分配的类。我想把这些放在一个单独的模块中,以防止我的代码杂乱无章;但是,一旦模块超出范围(在进入 main() 之前),对象就会被释放,让我尝试在 main.xml 中使用空引用。一个简短的例子:

// 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");
}

“开始”是一个局部范围变量,它会影响全局变量。全局一未初始化。在我将其更改为:

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

程序不再崩溃。

于 2012-01-25T19:10:45.580 回答