c++ - 如何在 C++ 中存储带单位的数字数据?

标签 c++ types

我有 Vehicle 不同类型的 Fuel(石油、氦气、电...)来给它们充电。显然石油和电力有不同的单位。我将在未来使用 FuelingStation 以类似的方式处理不同的燃料。如何存储 Fuel 信息?

对象 Fuel 的数量和单位? FuelType 类型的对象和 Vehicle 类中的 float fuelAmount

我明白,这是一个宽泛的问题,但一般的建议是什么?

最佳答案

我认为为多种燃料类型设置不同的类别并不是正确的解决方案,因为计算消耗量不是燃料的责任,而是汽车的责任。我相信应该有多种类型的汽车,它们使用不同的燃料类型并以不同的方式实现 calculateFuelConsumption()fillFuel()

对于燃料类型,我相信所有需要的只是一个简单的枚举,并且不需要为 Fuel 类建模,除非它将用于存储不同的燃料特定属性,而事实并非如此在这里。

以下是我认为合理的解决方案,它实现了各种燃料类型的枚举、用于检索燃料单位名称的静态映射以及用于根据燃料类型创建不同类型汽车的工厂模式:

class Car
{
public:
    enum FuelType
    {
        UNKNOWN_FUEL,
        PETROLEUM_FUEL,
        ELECTRICITY_FUEL,
        HELLIUM_FUEL
    };

    Car();

    FuelType getFuelType() const { return m_fuelType; }
    std::string getFuelUnit(FuelType type) { return m_fuelUnits.at(type); }
    virtual float calculateFuelConsumption(float distance, float speed) const = 0;
    virtual void fill(FuelType fuelType) = 0;

private:
    FuelType m_fuelType;
    static std::map < FuelType, std::string> m_fuelUnits;
};

std::map < Car::FuelType, std::string> Car::m_fuelUnits
{
    { Car::UNKNOWN_FUEL, "unknown" },
    { Car::PETROLEUM_FUEL, "litres" },
    { Car::ELECTRICITY_FUEL, "Ah" },
    { Car::HELLIUM_FUEL, "cubic metres" }
};

class PetrolFueledCar : public Car
{
public:
    // ...
    float calculateFuelConsumption(float distance, float speed) const { /* ... */ }
    void fill(FuelType fuelType)  { /* ... */ } 
};

class HelliumPoweredCar : public Car
{
public:
    // ...
    float calculateFuelConsumption(float distance, float speed) const { /* ... */ }
    void fill(FuelType fuelType)  { /* ... */ }
};

class CarFactory
{
public:
    static unique_ptr<Car> newCar(Car::FuelType fuelType)
    {
        if (fuelType == Car::PETROLEUM_FUEL)
            return new PetrolFueledCar;
        if (fuelType = Car::HELLIUM_FUEL)
            return new HelliumPoweredCar;
        // ...
    }
};

关于c++ - 如何在 C++ 中存储带单位的数字数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21970196/

相关文章:

c++ - 如何在 O(1) 或 O(log n) 时间复杂度中检查 2 个 c++ 数组是否相同(所有元素都相同,顺序很重要)?

c++ - 将结构复制(使用赋值)到 union 内的结构导致段错误

javascript - 有没有办法在 Typescript 的包装函数中动态键入函数?

matlab - 有没有更好的方法在 MATLAB 中声明一个空的类型化矩阵?

c++ - 如何在快速排序算法中使用函数指针

c++ - 在 Windows 上安装 QJson

c++ - 了解以下 cpp 片段

mysql - 带有 MySQL 数据库的 Ruby on Rails 应用程序

java - 为什么使用 == 比较两个整数有时有效有时无效?

C# 泛型和类型检查混淆