我最近开始使用Tango库学习D版本1。我决定编写一个包含Dout
的小类tango.io.Stdout
,除了它覆盖opShl
以更好地匹配C ++的<<
样式输出。我的实现是这样的:
// dout.d
module do.Dout;
import tango.io.Stdout;
class Dout
{
public static Dout opShl(T) (T arg)
{
stdout(arg);
return new Dout;
}
public static Dout newline()
{
stdout.newline;
return new Dout;
}
}
在主要内容中,我对Dout.opShl()进行了简单的调用,就像这样。
// main.d
import do.Dout;
import tango.io.Console;
int main(char[][] argv)
{
Dout << "Hello" << " world!" << Dout.newline;
Cin.get();
return 0;
}
这样可行,但在按下进入和退出主菜单后,将打印文本“do.Dout.Dout”。单步执行代码后,我发现该文本打印在汇编指令中:
00406B5C call __moduleDtor (40626Ch)
在哪个do.Dout的析构函数被调用。
我的问题是,为什么在退出main时打印模块名称,我该怎么做才能阻止这种行为?
答案 0 :(得分:3)
打印“do.Dout.Dout”的原因是因为Dout << Dout.newline;
打印了一个新行(在newline
属性调用中),然后尝试打印一个人类可读的字符串{{1 object(在传递给Dout
之后)
你只能在销毁期间看到它,因为那时输出被刷新;)
你应该做的
opShl!Dout()
更接近C风格(Dout是一个全局对象而不会重新创建每次调用,换行是一个特殊的结构,除了向其添加换行符之外还刷新输出)