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;
}
,反之亦然。因此,无需为此定义特殊方法,您可以只使用类型的铸件。
一些有用的链接:超载键入
相关文章:
- 不同翻译单元中不可重载的非内联函数定义
- 需要将一行代码从C++ Qt翻译成PyQt
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 在没有 API 的情况下使用谷歌翻译文本
- 如何执行 cppcheck 交叉翻译单元 (CTU) 静态分析?
- 模板变量是否允许在多个翻译单元中并有效合并?
- 是否允许类在程序中的不同翻译单元之间具有不同的定义?
- 我怎样才能代替使用新的使用malloc翻译
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 如何将 'in' 关键字从 python 翻译成 c++?
- 为什么不同的翻译单元没有独立和沙盒的内存空间?
- 如何用c语言翻译openssl命令pbkdf2
- 为什么编译器不在同一翻译单元中警告 ODR 违规
- 静态变量在同一个翻译单元中被静态方法使用时是否保证被初始化?
- 如何翻译这个给定代码中的 ::* 运算符和member_fn?
- 来自不同翻译单元的函数会干扰吗?
- 在 opengl 中翻译相机时遇到问题
- 如何平均继续翻译向量
- 如何在C++中的不同翻译单元之间共享枚举的实例
- 在Visual Studio中更新Qt翻译(.ts文件)时出现未指定错误