2010-05-07 36 views
3

我正在将一些C++代码从结构迁移到类。将C++代码从结构迁移到类

我使用的结构主要是位字段优化,我不再需要它了(我现在比节省空间更担心速度)。

  • 执行此迁移的一般准则是什么?我仍然处于规划阶段,因为这是影响大部分代码的重大举措。在做之前我想先计划一切。 我应该牢记的是什么?
+1

为什么? 'class' =='struct'。只要保持结构并添加行为。顺便说一下,这意味着类也可以包含位字段。 – 2010-05-07 11:19:56

回答

4

我无法命名全部必不可少的东西,但我可以命名一个:封装

结构和类之间的C++唯一的技术差异是默认访问。在一个结构中,默认情况下一切都是公共的;在一堂课中,一切都是私密的。我假设你在这里谈论POD结构,一切都是公开的。

我会做的是这样的:

  1. 更改struct关键字class,看看调用代码休息。这会给你一个线索,说明在哪里使用哪种类型的部件。
  2. 由此,确定哪些类型的元素应该是公开的,哪些应该是私有的。
  3. 为公共部分编写访问函数,并更改调用代码以使用它们。
  4. 将需要访问私有部分的代码移入类本身。
1

C++中的结构和类之间没有明显的区别(它们仅在默认可见性方面有所不同)。除非你还要添加有意义的行为,否则我不会费心将这些结构迁移到类中。

+0

@Mystagogue:增加“有意义的行为”是计划的一部分。 – Lazer 2010-05-07 06:23:59

+2

@eSKay:对你来说可能并不重要,但是:在C中,一个空的结构的大小为0.在C++中,一个空的结构/类的大小为1. – jweyrich 2010-05-07 06:31:15

+0

@jweyrich:哇! [C](http://codepad.org/XKyHtIZN#output)vs [C++](http://codepad.org/kI0V6Xjw#output)!从来不知道这一点从来不必使用空的结构。感谢您指出!找到一些解释[这里](http://stackoverflow.com/questions/621616)。 – Lazer 2010-05-16 05:15:27

4

当更新从C到C++遗留代码库,我的经验是有很少的价值,完全是太多精力参与实际重新构建你的应用程序结构转换成传统的C++对象。因为不要犯错,那就是你最终会做的事情。它一开始似乎不是,但最终你会意识到你正在重新设计应用程序。

对于你的目标是什么都没有说,所以也许这是你的目标,但是如果你只是想转换为C++,那么你的应用程序中的新代码可以是C++,只需重命名文件,添加一群来自void *的隐式转换在之前发生,并继续你的生活。

1

第一个,我会加入其他人,并说将所有代码从结构移动到类可能不是最好的举措。如果你做得很好(也就是说,不仅仅是改变struct X {class X { public:),这意味着重新设计应用程序(或多或少是一个完整的重写)。

这涉及到引入新的错误,新的开发周期,额外的测试,更改文档等。考虑到你可能有这样做的正当理由(对我来说“只是为了好玩”和“看看我能不能做到这一点”在某些情况下可以是有效的理由:D)这里是我的答案您的问题:

1. What are the general guidelines for doing this migration? 
2. What are all the essential things I should keep in mind? 

准则,事情要记住:

  • 工作在非常小的迭代,并确保应用程序是迭代之间的功能秒。如果你有单元测试的定义,你可以通过他们的方式工作(选择一个单元,按照一系列步骤重新设计(见下面),然后修改并运行测试。)

  • 选择代码的一个区域并完成它

  • 尽量遵循这些步骤,每一个变化:

    • 分析功能,并重新设计
    • 并行创新实现与旧的
    • 开关在新的实现无处不在旧的使用
    • 测试应用程序仍然工作
    • 删除旧代码
    • 测试应用程序仍然工作
  • 如果你不现在这样做,开始使用分支源代码管理软件。没有什么比这更削减了。我建议Mercurial,但我知道GIT具有大致相同的功能。 你可以稍后感谢我:o)。

  • 以事务方式执行更改(从一个区域开始并完成它,而没有添加其他区域的更改,而第一个区域的更改为半途)。如果您使用分支源代码控制和多个开发人员,则每次只能为每个开发人员更改一个区域,然后集中这些更改。一个重构方法的

优点:

  • 应用保持功能,如果你通过决定中途的努力是不值得的(或者如果管理层决定的努力是不值得)

  • 的应用程序的稳定性通过变化仍然可控

如果你建立了一些里程碑,这应该是相当易于管理的。

祝你好运!