Challenge

Project 3

#include <iostream>
#include <vector>
#include <string>

using namespace std;

enum class Type {
GAS,
DIESEL,
ELECTRIC
};

class Vehicle {
protected:
string make;
string model;
int year;
int odometer;
public:
Vehicle(string make, string model, int year, int odometer) : make(make), model(model), year(year), odometer(odometer) {}
string getMake() const { return make; }
string getModel() const { return model; }
int getYear() const { return year; }
int getOdometer() const { return odometer; }
void setMake(string make) { this->make = make; }
void setModel(string model) { this->model = model; }
void setYear(int year) { this->year = year; }
void setOdometer(int odometer) { this->odometer = odometer; }
virtual Type getType() = 0;
virtual void checkTireRotation() {
int remainder = odometer % 50000;
if (odometer >= 50000 || remainder >= 0) {
cout << "Tire rotation needed for " << make << " " << model << endl;
}
}
virtual void getCarInformation() {
cout << "Make: " << make << endl;
cout << "Model: " << model << endl;
cout << "Year: " << year << endl;
cout << "Odometer: " << odometer << endl;
}
};

class GasCar : public Vehicle {
public:
GasCar(string make, string model, int year, int odometer) : Vehicle(make, model, year, odometer) {}
Type getType() override { return Type::GAS; }
string getFuelType() { return "Gasoline"; }
};

class DieselCar : public Vehicle {
public:
DieselCar(string make, string model, int year, int odometer) : Vehicle(make, model, year, odometer) {}
Type getType() override { return Type::DIESEL; }
string getFuelType() { return "Diesel"; }
};

class ElectricCar : public Vehicle {
public:
ElectricCar(string make, string model, int year, int odometer) : Vehicle(make, model, year, odometer) {}
Type getType() override { return Type::ELECTRIC; }
void checkTireRotation() override {
int remainder = odometer % 50000;
if (odometer >= 50000 || remainder >= 0) {
cout << "Tire rotation needed for " << make << " " << model << endl;
}
}
void checkChargerPower() {
int remainder = odometer % 400;
if (odometer >= 400 || remainder >= 0) {
cout << "Battery recharge needed for " << make << " " << model << endl;
}
}
};

class FuelVehicle : public Vehicle {
public:
FuelVehicle(string make, string model, int year, int odometer) : Vehicle(make, model, year, odometer) {}
virtual void checkOil() {
cout << "Oil change needed for " << make << " " << model << endl;
}
virtual Type getType() = 0;
};

class Inventory {
private:
vector<Vehicle*> vehicles;
public:
void addVehicle(Vehicle* vehicle) {
vehicles.push_back(vehicle);
}
void listVehicles() {
for (auto v : vehicles ) {
v->getCarInformation();
cout << "Fuel type: ";
if (v->getType() == Type::GAS) {
cout << dynamic_cast<GasCar*>(v)->getFuelType();
} else if (v->getType() == Type::DIESEL) {
cout << dynamic_cast<DieselCar*>(v)->getFuelType();
} else if (v->getType() == Type::ELECTRIC) {
cout << "Electric";
}
cout << endl;
}
}
void checkMaintenance() {
for (auto v : vehicles) {
v->checkTireRotation();
if (dynamic_cast<FuelVehicle*>(v)) {
dynamic_cast<FuelVehicle*>(v)->checkOil();
}
if (dynamic_cast<ElectricCar*>(v)) {
dynamic_cast<ElectricCar*>(v)->checkChargerPower();
}
}
}
};

int main() {
Inventory inventory;
GasCar* car1 = new GasCar("Toyota", "Camry", 2015, 60000);
DieselCar* car2 = new DieselCar("Ford", "F-150", 2012, 80000);
ElectricCar* car3 = new ElectricCar("Tesla", "Model S", 2020, 30000);
inventory.addVehicle(car1);
inventory.addVehicle(car2);
inventory.addVehicle(car3);
inventory.listVehicles();
inventory.checkMaintenance();
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.