gpt4 book ai didi

c++ - 创建自定义或使用内置类型

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:08 24 4
gpt4 key购买 nike

在一些项目中,人们为所有内容创建自定义类型,而在其他项目中,他们只使用整数和 float 来表示温度、长度和角度。

我可以看到两者的优点和缺点,我想这取决于您正在从事的项目类型,创建这些类型是否是个好主意。

这是我的想法:

class SomeClass
{
Physics::Temperature TemperatureOnMoon(Geometry::Distance distanceFromSun);

Geometry::Area Shadow(Geometry::Angle xAngle, Geometry::Angle yAngle, Geometry::Triangle triangle);
};

Temperature 类型将有一个 Fahrenheit() 和 Celsius() 方法,Area 类型将有一个采用两个 Point 类型的构造函数等等。

这提供了很好的类型安全性,我认为它增加了可读性,但它也产生了很多依赖性。突然之间,每个使用 SomeClass 的人都必须包含所有这些其他 header ,因此您在创建单元测试时必须做更多的工作。开发所有类型也需要时间。

使用内置类型的方法使用起来更简单,依赖性也更少:

class SomeClass
{
double TemperatureOnMoon(double distanceFromSun);

double Shadow(double xAngle, double yAngle, double triangle);
};

我的问题是,您在多大程度上创建了这些类型?您会在大型项目中更喜欢它们吗?是否有针对此类内容的现成库?

最佳答案

我会避免在不必要时创建新类型。以下是您必须处理的一些问题:

  1. 它隐藏了关于精度的信息——就像在距离的情况下,距离是多少?它是整数吗?它是 float 吗?它是 double 吗?
  2. 您在使用标准库时会遇到问题 - 例如,您可以使用 max(distance1, distance2) 吗?如何排序距离?您将必须明确地创建一个比较函数。它还取决于您如何定义类型。如果它是原始类型的 typedef,则可能不需要创建新的比较函数或最大函数。但它仍然会令人困惑。但是,如果您的 Distance 现在是类或结构,那么您将不得不显式重载所有运算符,+ - = *.....

  3. 因为您不知道它是浮点类型还是整数,所以您不知道是否可以安全地使用 == 来比较 2 个距离。它们可以是 float ,如果以不同的方式进行操作,由于精度问题,它们最终可能会得到与理论上不同的结果。

  4. 要维护的文件数量会越来越多,构建过程会不必要地延长。

如果新类型作为基元根本没有意义,我会创建新类型,并且您确实希望重载所有运算符或不允许某些运算符。我正在努力寻找一个很好的例子,但是一个例子可以是“二进制数”所以如果你将 BinaryNumber 定义为一个类/结构而不是将它用作一个有意义的整数,因为如果你有一个 int binaryNumber1= 1、binaryNumber2=1;在执行 binaryNumber1+binaryNumber2 的过程中,您会期望结果是 10 而不是 2,对吗?因此,您将定义一个 BinaryNumber 类/结构并重载运算符 + - */等。

关于c++ - 创建自定义或使用内置类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30647852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com