Project 3
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
enum Type { GAS, DIESEL, ELECTRIC };
class Vehicle {
protected:
string make, model;
int year, odometer;
public:
Vehicle(string mk, string mdl, int yr, int odo) : make(mk), model(mdl), year(yr), odometer(odo) {}
virtual ~Vehicle() {}
virtual Type getType() = 0;
void displayInfo() {
cout << "Make: " << make << ", Model: " << model << ", Year: " << year << ", Odometer: " << odometer << " km\n";
}
int getOdometer() { return odometer; }
void updateOdometer(int odo) { odometer = odo; }
};
class FuelVehicle : public Vehicle {
public:
FuelVehicle(string mk, string mdl, int yr, int odo) : Vehicle(mk, mdl, yr, odo) {}
virtual string getFuelType() = 0;
void checkOil() {
cout << "Oil check needed for " << make << " " << model << "\n";
}
};
class GasCar : public FuelVehicle {
public:
GasCar(string mk, string mdl, int yr, int odo) : FuelVehicle(mk, mdl, yr, odo) {}
Type getType() override { return GAS; }
string getFuelType() override { return "Gas"; }
};
class DieselCar : public FuelVehicle {
public:
DieselCar(string mk, string mdl, int yr, int odo) : FuelVehicle(mk, mdl, yr, odo) {}
Type getType() override { return DIESEL; }
string getFuelType() override { return "Diesel"; }
};
class ElectricCar : public Vehicle {
public:
ElectricCar(string mk, string mdl, int yr, int odo) : Vehicle(mk, mdl, yr, odo) {}
Type getType() override { return ELECTRIC; }
void checkTireRotation() {
if (odometer % 50000 == 0)
cout << "Tire rotation needed for " << make << " " << model << "\n";
}
void checkChargerPower() {
if (odometer % 400 == 0)
cout << "Recharge battery for " << make << " " << model << "\n";
}
};
vector<shared_ptr<Vehicle>> inventory;
void listVehicles() {
for (size_t i = 0; i < inventory.size(); i++) {
cout << i + 1 << ". ";
inventory[i]->displayInfo();
}
}
void addVehicle() {
string make, model;
int year, odo, type;
cout << "Enter make: "; cin >> make;
cout << "Enter model: "; cin >> model;
cout << "Enter year: "; cin >> year;
cout << "Enter odometer: "; cin >> odo;
cout << "Enter type (0: Gas, 1: Diesel, 2: Electric): "; cin >> type;
if (type == 0) inventory.push_back(make_shared<GasCar>(make, model, year, odo));
else if (type == 1) inventory.push_back(make_shared<DieselCar>(make, model, year, odo));
else if (type == 2) inventory.push_back(make_shared<ElectricCar>(make, model, year, odo));
}
void updateVehicle() {
int idx, newOdo;
cout << "Enter vehicle index to update: "; cin >> idx;
if (idx <= 0 || idx > inventory.size()) return;
cout << "Enter new odometer reading: "; cin >> newOdo;
inventory[idx - 1]->updateOdometer(newOdo);
}
void removeVehicle() {
int idx;
cout << "Enter vehicle index to remove: "; cin >> idx;
if (idx <= 0 || idx > inventory.size()) return;
inventory.erase(inventory.begin() + (idx - 1));
}
void checkTireRotation() {
for (const auto& car : inventory) {
if (auto eCar = dynamic_pointer_cast<ElectricCar>(car)) {
eCar->checkTireRotation();
}
}
}
void checkOilChange() {
for (const auto& car : inventory) {
if (auto fCar = dynamic_pointer_cast<FuelVehicle>(car)) {
fCar->checkOil();
}
}
}
void checkRecharge() {
for (const auto& car : inventory) {
if (auto eCar = dynamic_pointer_cast<ElectricCar>(car)) {
eCar->checkChargerPower();
}
}
}
int main() {
int choice;
while (true) {
cout << "0. Quit\n1. List inventory\n2. Add vehicle\n3. Update vehicle\n4. Remove vehicle\n5. Tire Rotation\n6. Oil Change\n7. Recharge\n";
cin >> choice;
switch (choice) {
case 0: return 0;
case 1: listVehicles(); break;
case 2: addVehicle(); break;
case 3: updateVehicle(); break;
case 4: removeVehicle(); break;
case 5: checkTireRotation(); break;
case 6: checkOilChange(); break;
case 7: checkRecharge(); break;
default: cout << "Invalid choice! Try again." << endl;
}
}
return 0;
}