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

C++ 创建自定义类型或使用内置类型,c++,C++,在一些项目中,人们为所有内容创建自定义类型,而在另一些项目中,他们只使用int和float来表示温度、长度和角度 我可以看到两者的优点,也可以从中吸取教训,我想这取决于您正在从事的项目类型,是否创建这些类型的项目是一个好主意 以下是我的想法: class SomeClass { Physics::Temperature TemperatureOnMoon(Geometry::Distance distanceFromSun); Geometry::Area Shadow(Geo

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

我可以看到两者的优点,也可以从中吸取教训,我想这取决于您正在从事的项目类型,是否创建这些类型的项目是一个好主意

以下是我的想法:

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

    Geometry::Area Shadow(Geometry::Angle xAngle, Geometry::Angle yAngle, Geometry::Triangle triangle);
};
温度类型将有一个Fahrenheit()和cellices()方法,面积类型将有一个接受两个点类型的构造函数,以此类推

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

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

class SomeClass
{
    double TemperatureOnMoon(double distanceFromSun);

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

我的问题是,你在多大程度上创造了这些类型?在大型项目中,您更喜欢它们吗?有现成的图书馆来存放这类东西吗

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

  • 它隐藏了关于精度的信息——就像在距离的情况下,距离可以是什么?它是一个整数,是一个浮点,是一个双精度的吗
  • 您在使用标准库时会遇到问题-例如,是否可以使用max(距离1,距离2)?分拣距离如何?您必须显式地创建一个比较函数。这还取决于您如何定义类型。如果是基元类型的typedef,则可能不需要创建新的比较函数或max函数。但这仍然令人困惑。但是如果您的距离现在是一个类或结构,那么您必须显式重载所有运算符,+-=*

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

  • 要维护的文件数量将更大,构建过程将不再需要更长的时间
    我会创建新类型,如果它们作为基本体毫无意义,并且您确实希望重载所有运算符或不允许某些运算符。我正在努力寻找一个好的例子,但是一个例子可以是“一个二进制数”,所以如果你将一个二进制数定义为一个类/结构,而不是将它作为一个整数使用,这是有意义的,因为如果你有一个int-binaryNumber1=1,binaryNumber2=1;在这个过程中的某个地方,你做binaryNumber1+binaryNumber2,你会期望结果是10而不是2,对吗?因此,您需要定义一个BinaryNumber类/结构并重载运算符+-*/等。

    取决于您团队的编码约定和首选项。角度、距离等具有不同类型(不可转换)的一个优点是对其物理意义进行建模:即不能将距离指定给角度类型的变量-必须进行有意义的转换,这可能是函数或重载运算符(即速度应为距离/时间结果的类型)-然而,维护这种图书馆是很困难的。然后你需要一个类型来模拟一个比率(距离的两倍不是正方形)…使用这种概念可能会很有趣。例如,您可以定义与物理有关的运算符:
    Speed运算符/(常数距离和常数持续时间)(编辑:与BeyelerStudios相同的示例…)。有时在模拟中使用的另一个例子是重新定义所有基本类型,将导数包含在变量中,然后在代码中的任何地方都使用它。注意:boost::units可能很有趣:我明白你的意思,但我不确定我是否同意。当然,如果不想在STL算法中使用这些类型的比较运算符,则必须重载这些类型的比较运算符。在实现==运算符时,您知道内部类型是什么,如果是浮点,您将执行类似于fabs(a-b)