Extended car class
Code Inereusz A.user_6919294
c_cpp
24 days ago
4.9 kB
5
Indexable
Never
/* Łap Daria :) To rozszerzona wersja klasy Car zawiera następujące ulepszenia i nowe funkcjonalności: - Dodano hierarchię klas dla silników (abstrakcyjna klasa bazowa Silnik i klasy pochodne SilnikBenzynowy i SilnikDiesel). - Użyto std::unique_ptr do zarządzania obiektem silnika, co zapewnia automatyczne zarządzanie pamięcią. - Dodano enumerację TypNapedu do reprezentacji różnych typów napędu. - Wprowadzono wektor FWyposazenie do przechowywania listy elementów wyposażenia. - Rozszerzono konstruktor o dodatkowe parametry. - Dodano metodę UstawSilnik do przypisywania silnika do samochodu. - Wprowadzono metodę DodajWyposazenie do dodawania elementów wyposażenia. - Rozbudowano metodę Przyspiesz, uwzględniając moc silnika i zużycie paliwa. - Dodano metodę Zatankuj z obsługą wyjątków w przypadku próby przelania zbiornika. - Znacznie rozszerzono metodę PobierzInformacje, aby zawierała więcej szczegółów o samochodzie. - Dodano prywatną metodę pomocniczą NapedToString do konwersji typu napędu na string. Ta wersja klasy jest bardziej elastyczna, bezpieczna i bogata w funkcjonalności, co czyni ją bardziej profesjonalną i gotową do użycia w bardziej złożonych aplikacjach */ #include <System.hpp> #include <vector> #include <memory> #include <stdexcept> // Abstract base class for engines class Engine { public: virtual double GetPower() const = 0; virtual ~Engine() = default; }; class PetrolEngine : public Engine { private: double FPower; public: PetrolEngine(double APower) : FPower(APower) {} double GetPower() const override { return FPower; } }; class DieselEngine : public Engine { private: double FPower; public: DieselEngine(double APower) : FPower(APower) {} double GetPower() const override { return FPower; } }; class Car { public: enum class DriveType { FrontWheel, RearWheel, AllWheel }; private: String FBrand; String FModel; int FYearOfManufacture; double FSpeed; double FFuel; const double FTankCapacity; DriveType FDriveType; std::unique_ptr<Engine> FEngine; std::vector<String> FEquipment; public: Car(const String& ABrand, const String& AModel, int AYearOfManufacture, double ATankCapacity, DriveType ADriveType) : FBrand(ABrand), FModel(AModel), FYearOfManufacture(AYearOfManufacture), FSpeed(0), FFuel(ATankCapacity), FTankCapacity(ATankCapacity), FDriveType(ADriveType) {} // Set the engine for the car void SetEngine(std::unique_ptr<Engine> AEngine) { FEngine = std::move(AEngine); } // Add an equipment item to the car void AddEquipment(const String& AItem) { FEquipment.push_back(AItem); } // Increase the car's speed void Accelerate(double ADelta) { if (FFuel > 0 && FEngine) { FSpeed += ADelta * (FEngine->GetPower() / 100.0); FFuel -= ADelta * 0.01; // Example fuel consumption } if (FSpeed < 0) FSpeed = 0; if (FFuel < 0) FFuel = 0; } // Decrease the car's speed void Decelerate(double ADelta) { FSpeed -= ADelta; if (FSpeed < 0) FSpeed = 0; } // Refuel the car void Refuel(double AAmount) { if (FFuel + AAmount > FTankCapacity) { throw std::runtime_error("Tank overflow!"); } FFuel += AAmount; } // Get detailed information about the car String GetInformation() const { String info = String().sprintf(L"Car: %s %s\n" L"Year of manufacture: %d\n" L"Current speed: %.2f km/h\n" L"Fuel: %.2f / %.2f l\n" L"Drive type: %s\n" L"Engine power: %.2f HP\n" L"Equipment: ", FBrand.c_str(), FModel.c_str(), FYearOfManufacture, FSpeed, FFuel, FTankCapacity, DriveTypeToString(FDriveType).c_str(), FEngine ? FEngine->GetPower() : 0.0); for (const auto& item : FEquipment) { info += item + L", "; } if (!FEquipment.empty()) { info = info.SubString(1, info.Length() - 2); // Remove last comma and space } return info; } private: // Convert DriveType enum to String static String DriveTypeToString(DriveType ADriveType) { switch (ADriveType) { case DriveType::FrontWheel: return L"Front-wheel drive"; case DriveType::RearWheel: return L"Rear-wheel drive"; case DriveType::AllWheel: return L"All-wheel drive"; default: return L"Unknown"; } } };
Leave a Comment