Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
D 具有类和结构的名称空间?_D_Oop - Fatal编程技术网

D 具有类和结构的名称空间?

D 具有类和结构的名称空间?,d,oop,D,Oop,如果我有D语言的“嵌套成员”就好了,所以我有了编写代码的不光彩想法 class Keyboard { struct Unused { string key1 = "Wake Up"; string key2 = "Sleep"; string key3 = "Power"; } Unused unused; } int main() { Keyboard kb; kb.unused.key1 = "S

如果我有D语言的“嵌套成员”就好了,所以我有了编写代码的不光彩想法


class Keyboard
{
    struct  Unused {
        string key1 = "Wake Up";
        string key2 = "Sleep";
        string key3 = "Power";
    }

    Unused unused;
}

int main()
{
    Keyboard kb;
    kb.unused.key1 = "Scroll Lock";

    return 0;
}

好吧,这也是一个坏例子。但是我正在学习面向对象编程,不知道这是不是一件好事,或者怎么做。

这样做本身没有错,这里的问题是
kb
仍然是
null
。您需要创建一个
键盘
对象:

Keyboard kb = new Keyboard();
如果不想在键盘上键入两次
,可以使用
auto

auto kb = new Keyboard();
D将自动为您确定正确的类型


将相关对象像这样分组到一个结构中是一种相当常见的做法,尽管通常您需要一个比
Unused
更具描述性的名称(否则,为什么要使用名称空间?)

您可以使用您第一次建议的语法。只需将未使用的设置为静态成员。这很好:

class Keyboard
{
    struct Unused {
         string key1 = "Wake Up";
         string key2 = "Sleep";
         string key3 = "Power";
    }

    static Unused unused;   // **This is now a static member**
}

int main()
{
    Keyboard kb;
    kb.unused.key1 = "Scroll Lock";

    return 0;
}

真可惜!从自动到键盘运行程序有一些不同,或者编译后是同一件事?完全一样:编译器可以看到
new Keyboard()
在编译时返回
Keyboard
,只添加类型本身。编译后的代码没有区别。@pslacerda,它被称为类型推断,在D.foreach(w;words)、sort(words)中无处不在;这里的排序也有推论。全称它为排序!(不可变字符)[],“a