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)
,因为它需要外部类的环境指针
.
只要把初化
移到构造器
中就可修复,不需要把它们变成静态
的,现在,也许不想有个带引用外部类
的嵌套类
,此时,应该把它变成静态
的.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现