C 类翻译设计

C++ Class Translation Design

本文关键字:翻译      更新时间:2023-10-16

我有A类和B类。我有两个功能:

B FromAToB(A)A FromBToA(B)

问题是:我应该在哪个类中实施这些功能?还是他们应该属于另一堂课?还是没关系?

放置这些功能的位置取决于您的使用方式。

正如@foggyday评论的那样,没有一个"真实答案"。对我来说,简单的功能将全部完成。

您可以提供相互转换操作员。这将需要您转发声明一个类,并将转换操作员的实现推迟到实施另一类后。例如:

#include <iostream>
struct Seconds;
struct Minutes
{
    int value;
    operator Seconds() const;
};
struct Seconds
{
    int value;
    operator Minutes() const
    {
        return Minutes{value / 60};
    }
};
Minutes::operator Seconds() const
{
    return Seconds{value * 60};
}
int main()
{
    Minutes m{1};
    Seconds s{60};
    std::cout << static_cast<Seconds>(m).value << " "
              << static_cast<Minutes>(s).value;
    return 0;
}

如果您不需要隐式转换(避免错误),则可以向操作员添加explicit

所以...根据您的需求和意图,有多种方法可以做到这一点。如果每个功能都设计为从一种类型到另一种类型的破坏性转换,我的建议是在您要转换的类型上创建一个操作员,并以某种方式注意它具有破坏性。这是非常主观的,但是您可以以另一种方式做到这一点,我想不出任何原因将不太有效,只是大多数从A型转换为B类型的惯例,将操作员放在A型A上(请参阅诸如ToString之类的内容在C#)。

如果转换是无损的,即,您正在使用A并根据A进行B进行A,那么有两种非常好的方法可以做到这一点:打字操作员或构造函数。我的个人建议是每种类型的构造函数。A::A(const &B)是一个构造函数,它将占用B并从中制成A。这往往是最清楚的发生的事情和进行此转换的潜在性能成本。

简单地您可以将铸造运算符重新定义为所需的每个类中的类型。

例如,您可以做到这一点:

,而不是调用函数(FromAtob等)。
operator B() {
  // Creating B b_object
  return b_object;
}

然后在代码中使用它

main() {
  // Creating A a_object
  B b_object = (B)a_object;
}

,反之亦然。因此,无需为此定义特殊方法,您可以只使用类型的铸件。

一些有用的链接:超载键入