类之间的转换

时间:2010-05-18 18:34:45

标签: c++ architecture

假设我们有一个名为A的类,另一个叫做B. 我们想要一个将A转换为B的转换方法。

从软件架构的角度来看,首选哪一个?

  1. A.export()
  2. B.import()
  3. 编写转换器类,即convert(A, B)Convert(A)或......
  4. 如果语言很重要,我正在使用C ++

5 个答案:

答案 0 :(得分:6)

这完全取决于您打算如何使用它,但在许多情况下,最简单的方法是实现转换构造函数:

class B { };
class A
{
    A(const B& b) { }
};

B b;
A a = b; //< calls converting constructor

(当然,您可以实现转换构造函数,以便从A转换为B

答案 1 :(得分:2)

首先,确定它们之间的转换是否真的自然而直观。在这种情况下,您可以使用构造函数或成员函数。

但是,如果连接不太自然,您可能希望使用带有转换方法的单独的ConversionUtils类或类似的东西。您不希望开始在类之间创建太多依赖项或最终实现n * n次转换。

小心使用“转换构造函数”也很重要,因为可以在没有意识到的情况下调用它们。例如,如果我有一个a和一个b并且我写了类似a==b的东西,那么A或B中的构造函数的存在会导致另一个构造函数成功编译警告,以及运行时可能有趣的结果。我强烈建议您在这些情况下制作构造函数explicit

答案 2 :(得分:1)

如果我们简要介绍一下Java(只是为了获取信息,即使您使用的是C ++):

假设A类是String,B类是Integer(或Double,Boolean,et c)。 Java库设计者在Integer(“B”)中放置了一个静态方法,称为getInteger(“import”),它接受一个String(“A”)并生成一个Integer(“B”)。那就是你的情况2。

另一方面,在每个类(称为“A”)中都有一个方法toString(“export”)返回一个String(“B”)。这将是你的情况1.

所以即使是这样的基础课,他们也决定采用不同的方式。我想这意味着和@James McNellis说的一样:这取决于。

答案 3 :(得分:0)

您可以重载强制转换运算符,即运算符T(){..返回T值}。你是否应该是另一回事。

答案 4 :(得分:0)

我会使用你的第三个建议。用于转换的单独转换器类。这样你就不会直接将A连接到B或B到A. A和B无论如何都有自己的责任。

转换器类C的责任纯粹是转换。每个班级都要对一件事负责,在我看来这是一件好事。我相信这是SOLID设计原则中的S(单一责任原则)。