[疑难] 关于D的3个疑问

ant-man 2007-09-22
谢谢,成功解决第一个和三个问题...
Colorful 2007-09-22
关于第二个问题,我做了些试验。
初步判断,这个问题是跟第三个问题是类似的。
均是关于变量初始化和编译时,运行时的问题。
看下面这段代码(为了说明问题,采用了楼主的相关类,其实下面的继承对于该问题来说没有必要):

public class Layout(T){}
public class Frame{}
public class MyFrame : Frame
{
    auto format = new Layout!(char);
}

这段代码,在DMD 2.004下,编译器报的错跟楼主差不多。
再来看下面的代码:

public class Layout(T){}
public class Frame{}
public class MyFrame : Frame
{
    this(){auto format = new Layout!(char);}
    //或者采用成员函数也行,因为从分配内存的角度看是一致的。
    // void SomeMethod(){auto format = new Layout!(char);}
}


上面的代码编译很成功。

第三个问题在于初始化在module级别,这个问题则是class级别。

PS:通常按照常理来说
public class MyFrame : Frame
{
    auto format = new Layout!(char);
}
这段代码应该被编译器优化为
public class MyFrame : Frame
{
    Layout!(char) format;
    this(){format = new Layout!(char);}
}

但是似乎D编译器并没有这么做。
Colorful 2007-09-22
再来举个非泛型的例子。
public class MyFrame : Frame
{
    Frame frame = new Frame();
}

看,这段代码跟第三个问题很相似,只是范围不同而已。

此外,就是模块没有this,只有static this罢了。
oldrev 2007-09-22
public class MyFrame : Frame  
{  
    Frame frame = new Frame();  
}  



这是无论如何不能接受的,new Frame() 的执行时机不能确定
Colorful 2007-09-22
oldrev 写道
public class MyFrame : Frame  
{  
    Frame frame = new Frame();  
}  



这是无论如何不能接受的,new Frame() 的执行时机不能确定


事实上,这段代码压根就不能编译通过。
但是,假如我们认为它能够通过编译,也就是语义等同于
public class MyFrame : Frame
{
    Frame frame;
    this(){frame = new Frame();}
}

它的执行时机是确定的:
1.首先执行super()来初始化父类Frame
2.然后执行this()来执行其中的代码内容,也就是再初始化它的成员frame.

这段代码可以说明问题:
void main()
{
    MyFrame myFrame = new MyFrame();
    myFrame.Show();
}

public class Frame{ public int Length; }
public class MyFrame : Frame
{
    Frame frame;
    this()
    {
        frame = new Frame();
        frame.Length = 10;
    }
    void Show()
    {
        printf("%d\n", frame.Length);
        printf("%d\n", this.Length);
        printf("%d\n", super.Length);
    }
}
oldrev 2007-09-23
Colorful 写道
oldrev 写道
public class MyFrame : Frame  
{  
    Frame frame = new Frame();  
}  



这是无论如何不能接受的,new Frame() 的执行时机不能确定


事实上,这段代码压根就不能编译通过。
但是,假如我们认为它能够通过编译,也就是语义等同于
public class MyFrame : Frame
{
    Frame frame;
    this(){frame = new Frame();}
}

它的执行时机是确定的:
1.首先执行super()来初始化父类Frame
2.然后执行this()来执行其中的代码内容,也就是再初始化它的成员frame.

这段代码可以说明问题:
void main()
{
    MyFrame myFrame = new MyFrame();
    myFrame.Show();
}

public class Frame{ public int Length; }
public class MyFrame : Frame
{
    Frame frame;
    this()
    {
        frame = new Frame();
        frame.Length = 10;
    }
    void Show()
    {
        printf("%d\n", frame.Length);
        printf("%d\n", this.Length);
        printf("%d\n", super.Length);
    }
}


如果 MyFrame 已经有了 ctor 的话 new Frame() 的执行应该在 ctor 之前还是之后,MyFrame 成员的初始化顺序如何决定?任何不确定的因素都是不可接受的。
Colorful 2007-09-23
我的示例代码,MyFrame已经定义了构造函数。
public class MyFrame : Frame
{
    auto format = new Frame();
}

这种用法编译器本身便不支持,或者说还没进行内联优化。所以我给出的是在语义相同的情况下,带构造器的代码示例。

通常如果做内联优化,上述代码new Frame的执行时机在构造器中,但是成员的初始化顺序的确是个问题。
Global site tag (gtag.js) - Google Analytics