2012-06-10 33 views

回答

31

原因#1选择struct vs class:类有继承,结构不。如果你需要多态,你必须使用类。

原因#2:结构通常是值类型(尽管如果您在其中工作,可以使它们成为引用类型)。类总是引用类型。所以,如果你想要一个值类型,选择一个结构。如果你想要一个参考类型,最简单的方法就是上课。

理由3:如果你有大量的数据成员的类型,那么你可能会想引用类型(以避免昂贵的复制),在这种情况下,你可能会选择一个班级。

原因#4:如果你想确定性地破坏你的类型,那么它将需要一个堆栈结构。 GC堆上没有确定性的破坏,GC堆上的破坏者/终结器可能永远不会运行。如果他们被GC收集,那么他们的终结者将被运行,但否则,他们不会。所以,如果你希望你的类型在它离开作用域时被自动销毁,你需要使用一个结构体并将它放在堆栈中。

至于你的具体情况,容器通常应该是参考类型(复制所有元素,每次你通过一个将会非常昂贵),并且是一个容器,所以你会想要使用一个类,除非你想要使它成为ref-counting结构的麻烦,这肯定是更多的工作。它的优势在于保证析构函数在不再使用时运行。

另一方面,如果你创建一个容器是一个类,你可能会想要使它成为最终的,这样它的各种函数就可以被内联了(如果该类不会被虚拟化, t衍生自Object以外的任何东西,它们不是Object所具有的功能),这对于性能绝对重要的容器可能很重要。

+0

假设容器类可以存储节点类型中的所有值:如果将其设置为结构,则每当删除节点并且节点本身包含引用值(类的对象)时,该引用是否也会被删除? 例: List!Object lisObj; ... Object obj = new Object; lisObj.add(obj) lisObj.remove(Obj); //将obj仍然存在? – Fred

+0

只是为了好奇,关于容器的福博图书馆有多完整?它有什么和缺少什么? – Fred

+1

任何与new分配的东西都是垃圾回收。如果你想在堆上的东西在特定的时间被释放,那么使用malloc和free来管理它们的内存。至于Phobos的容器,它们在std.container中,而且它们目前相当稀少,因为自定义分配器的东西仍然在被排除,我们正在等待在写入所有容器之前完成这些工作,因为否则在我们添加自定义分配器时会导致重做很多工作。如果内置类型和std.container不够用,请查看http://www.dsource.org/projects/dcollections –

5

"D"iving Into the D Programming Language

在d你结构,然后你得到的类。他们共享许多设施,但有不同的章程:结构是价值类型,而类是为动态多态而设计的,并且只能通过引用来访问。这种混淆,切片相关的错误,和评论拉//否!不要继承!不存在。当你设计一个类型时,你会预先决定它是一个单态值还是多态参考。 C++着名允许定义含糊不清的性别类型,但它们的使用是罕见的,容易出错的,并且令人反感,足以保证通过设计避免它们。

为了您Stack类型,你可能是最好的方法是定义其interface先实现(使用class),这样就不会搭配特定的实现你的Stack类型的接口。

+1

定义一个接口不是必需的,因为有鸭子打字(带编译时检查)。例如,D范围可以在没有接口的情况下使用,并且通常以结构体的形式实现。 –

+0

@ RomanD.Boiko:你是指模板吗?另外,'interface's有一定的优势。 – dirkgently

+0

是,约束模板参数。这两种方法都有其优点,我只是说,使用接口不是必要的,以避免耦合。 –