d嵌套同级类

原文
代码如下:

import std.stdio;

class a {

public:
     this(){}
    ~this(){}

    class b {
    public:
        this.outer.c C = new this.outer.c();
         this() {
                writeln(this.C.i);
        }
        ~this() {}

    }

    class c {
    public:
         this() {}
        ~this() {}
        int i = 10;
    }

}
int main () {
    int [int][int] test;
    test[0][20] = 19;
    writeln(Test[0][20]);
    a A = new A();
    a.b B = a.new a.b();
    return 0;
}

怎样才能让b和c互相访问,并自由创建实例呢?谢谢
忽略错别字,你可试动和静:

class a
{ //outer

 static class b
 { // inner 1

   c C;
   this()
   {
     this.C = new c;
     //writeln(this.C.i);
   }
 }

 static class c
 { // inner 2
   int i = 10;
 }
}

int main ()
{
 int[21][1] test;
 test[0][20] = 19;

 assert(test[0][20] == 19);

 auto B = new a.b;
 auto C = new a.c;

 assert(B.C.i == 10);
 assert(C.i == 10);

 return 0;
}

你好,在this()函数中移动"new c"确实可以.
请解释""作用?再次感谢
这里
非静态嵌套类通过包含(叫环境指针的)额外隐藏成员来工作,如果在函数中嵌套,则它是外围函数帧指针,如果在类中嵌套,则它是外围类实例的this引用.
实例化非静态嵌套类时,调用类的构造器前赋值环境指针,因此构造器完全访问外围变量.只有在必要环境指针信息可用时,才能实例化非静态嵌套类.
再者.用初化器声明类字段时,在编译时运行该初化器.表明即使确实工作,每个B实例都以精确的C对象开始(不是副本,是同一个).

这与许多按构造器的一部分,(并且在初化类时运行)初化式的其他语言不同.在D中仅按默认状态复制这些位新内存中.

因此,不应该非静态字段初化类引用.如果修改了叫C的对象,所有B新实例引用该修改实例!
编译器不喜欢它的原因是,因为编译时它不知道如何初化(c),因为它需要外部类的环境指针.
只要把初化移到构造器中就可修复,不需要把它们变成静态的,现在,也许不想有个带引用外部类嵌套类,此时,应该把它变成静态的.

posted @   zjh6  阅读(10)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示