2010-12-20 99 views
2

在我的业余时间,我一直在编写我为各种目的而编写的代码,并将它们挪用到其他语言中,以便查看其中的内容。目前我正在使用最初用Java编写的遗传编程图着色算法,并试图将其强制转换为C++。C++中的类的划分和设计

我用于任务的任意数据结构有几个类。在Java中,这对我来说并不是什么大问题,因为我已经接触了它一段时间。图表结构只创建一次,并且指定了ColouringColouring(特别是找到最优的一个)是代码的真正意义。我可以有一个Graph类内部类像NodeEdge,比如,我也可以有一个包带班GraphNodeEdge

上面的第一种情况可能会借给本身以及我的想法C++。主* .cpp文件可能有一些类Node,Graph,Edge,在其中定义。但是,从我所知道的看来,这似乎确实缺少了C++的观点。我只是把我在Java和强制它写入C++,在适当的地方添加析构函数并将对象引用转换为指针。我还没有想在C++中使用。这些类是否分离成单独的* .cpp文件?他们是否应该分开,然后编译成一个库在主程序中使用?我真正需要的是一些好的资源或人为的例子(或者甚至是经验法则)在C++编程中说,存在哪些不同的选择,以及什么时候考虑彼此的一个好主意?


编辑:我已经问@Pawel Zubrycki提供一些示例代码。我不打算这样做,因为每个组件都相当简单 - 它通常具有对下一件事的引用,以及一些get/set方法。然而,我会描述它。

这本质上是一个发病名单。有一些不必要的用法,称为...Pointer - 它们是首先用于向我解释发病名单的图解的直接翻译的产物。

有一种容器类,VertexList,其中包含一个头元件VertexPointer,和方法来添加新VertexPointer对象(它添加到该图中,但不将其连接到任何其它节点,允许的搜索来搜索非连通图),对Vertex对象的初始搜索索引等。每个VertexPointer都有一个Vertex对象,以及一个VertexPointer next;,以及所有这些方便的hasNext()方法。甲Vertex还具有相关联的ConnectionList

被复制为EdgeListEdgePointer,和Edge,不同之处在于Edge与两个Connection对象相关联的相同。

ConnectionListConnectionConnectionList模仿VertexListEdgeList,有Connection head;,所有这些方便的你所期望的方法,如addConnection()。 A Connection有一个Edge与它关联,以及一些Connection next;

这使我们可以很容易地获得图中任意一点的连通分量,并有任意数量的连接。


似乎很过度的顶级复杂,但相同的功能可以用VertexLinkedList一些对象被复制,EdgeLinkedList一个对象,和一些ConnectionLinkedList对象。对象允许我们遍历所有顶点以在顶点上进行穷尽搜索,同样适用于边缘。 ConnectionLinkedList对象允许我们快速遍历任何连接的顶点并在图中任意添加或连接。增加了复杂性,以处理评估图的某种着色的复杂性(加权边缘,局部子图的快速遍历等)

+0

这个问题更适合于programmers.stackexchange.com。 – 2010-12-20 11:43:48

+0

查看http://stackoverflow.com/questions/997924/c-best-practices – Simone 2010-12-20 11:45:06

+5

@Gunner - 我相信这个问题适合这两个网站。虽然它适合(也许更好),比如针对programmers.stackexchange.com列出的“Architecture”和“Design Patterns”之类的东西,但这是针对特定语言寻求答案的特定编程问题。我不是在问OOP是什么,也不是以某种语言不可知的方式询问某些设计模式。 @Simone - 这是一个有趣的阅读,但那里的链接没有解决我的问题。不过,我想我也会在业余时间阅读这篇文章。谢谢。 – JBirch 2010-12-20 11:52:20

回答

2

如果您有类似Node,GraphEdge及其它实现不是太大,将它们定义在同一个.cpp文件中非常有意义。毕竟,它们是为了一起使用。

在C++中,像这样的包称为组件。通常,在组件中思考比类更有意义,因为C++不仅是一种OOP语言,并且类并不总是首选的方式。

如果您想了解更多关于在C++中组织代码的首选方法,我推荐使用Large Scale C++ Software Design

顺便说一句:从这些类中创建一个库确实看起来过于矫枉过正。

+0

为了更清楚一些,所使用的数据结构是一个入侵列表,并且比“Node”,“Edge”等稍微复杂一点。数据结构本身可能不值得一个库,但是存在在搜索方面实现大量功能的可能性,以及我也可能另外指定的功能。是组件的复杂性,还是应该确定何时查看组件与库的功能规模?也感谢您的参考 - 我已经添加了一个到我的阅读列表。 – JBirch 2010-12-20 13:05:00

+0

这是一个非常开放的问题。但是有一个想法可能太看了Boost.Graph。它很复杂,但通常被认为设计得非常好。这里是它的邻接表实现的描述:http://www.boost.org/doc/libs/1_42_0/libs/graph/doc/adjacency_list.html – 2010-12-20 13:15:48

+0

...关于组件和库:这不是真的代码组织的问题,代码分发。毕竟,库包含组件。 – 2010-12-20 13:17:17