Как хранить числовые данные с единицами в C ++?

0

У меня есть Vehicle разных видов Fuel (бензин, гелий, электричество...), чтобы зарядить их. По-видимому, нефть и электроэнергия имеют разные единицы. Я собираюсь обрабатывать различные виды топлива аналогичным образом с FuelingStation в будущем. Как хранить информацию о Fuel?

Объект Fuel с количеством и единицами? Объект типа FuelType и float fuelAmount Внутри класса Vehicle?

Я разочарован. Это широкий вопрос, но каковы общие предложения?

  • 2
    Как вы управляете транспортным средством на гелии ???
  • 1
    Создайте базовый класс Fuel, затем производные классы для каждого типа Fuel и виртуальные методы для конкретных вычислений.
Показать ещё 2 комментария
Теги:
types

1 ответ

1
Лучший ответ

Я думаю, что разные классы для нескольких видов топлива - это не правильное решение, потому что это не топливная ответственность, чтобы рассчитать его потребление, а автомобиль. Я считаю, что вместо этого должны быть несколько типов автомобилей, которые используют разные виды топлива и реализуют 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;
        // ...
    }
};
  • 0
    Большое спасибо, это полностью отвечает на мой вопрос.
  • 0
    За исключением преобразования из обычного указателя в unique_ptr.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню