Challenge

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;

}

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.