Статическая инициализация и использование класса в отдельном модуле в D - PullRequest
4 голосов
/ 25 января 2012

В моей программе у меня есть класс, который я хочу выделить перед вводом main (). Я хотел бы убрать их в отдельный модуль, чтобы избежать беспорядка в моем коде; Однако, как только модуль выходит из области видимости (до входа в main ()), объекты освобождаются, и я пытаюсь использовать нулевую ссылку в main. Краткий пример:

// 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 голосов
/ 25 января 2012

Здесь:

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

"start" - это локальная переменная области видимости, которая скрывает глобальную переменную. Глобальный не инициализирован. После того как я изменил это на:

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

Программа перестала работать.

...