Ошибка при попытке получить сведения о машине
Есть программа, представляющая собой некую базу данных о автомобилях. Можно создать машину в базе данных (команда A), редактировать информацию о ней (команда E), удалить информацию (команда R), очистить терминал (команда C), получить информацию (команда G) и выйти из программы (команда Q). VIN - идентификационный номер авто. Проблема в том, что при запуске команды G и введении даже существующего номера выходит "Invalid input!". Код представлен ниже:
MainWrapper.h:
#ifndef ATOMPBLIESOOPDB_MAINWRAPPER_H
#define ATOMPBLIESOOPDB_MAINWRAPPER_H
#include "Vehicle.hpp"
#include <vector>
#include <algorithm>
#define RED "\033[31m"
class MainWrapper {
//<editor-fold desc="Auxiliary methods">
static void Quit() {
std::cout << RED << "Invalid input!";
std::exit(-1);
}
static int fV(std::vector<Vehicle *> &vehicles, long VIN) {
auto it = find_if(vehicles.begin(), vehicles.end(), [&VIN](Vehicle *v) { return v->getVIN() == VIN; });
if (it != vehicles.end())
return (int) std::distance(vehicles.begin(), it);
else Quit();
return -1;
}
static void pV(Vehicle &v){
std::cout << "VIN:\t" << v.getVIN() << std::endl;
for (int i = 0; i < v.doors.size(); ++i)
std::cout << "Door " << i << " is " << v.doors.at(i).checkIsOpen() << std::endl;
for (int i = 0; i < v.windows.size(); ++i)
std::cout << "Window " << i << " is " << v.windows.at(i).checkIsOpen() << " for "
<< v.windows.at(i).getLengthOpen() << std::endl;
for (int i = 0; i < v.pedals.size(); ++i)
std::cout << "Pedal " << i << " is " << v.pedals.at(i).checkIsPressed() << " for "
<< v.pedals.at(i).getPressForce() << std::endl;
for (int i = 0; i < v.lights.size(); ++i)
std::cout << "Light " << i << " is " << v.lights.at(i).checkIsOn() << std::endl;
std::cout << "Steering wheel is turned for " << v.steeringWheel.getAngle() << std::endl;
for (int i = 0; i < v.transmission.speeds.size(); ++i)
std::cout << "Speed " << i << " is " << v.transmission.speeds.at(i).getSpeed()
<< " and is set om this speed "
<< v.transmission.speeds.at(i).checkIsSetOnThisSpeed() << std::endl;
}
//</editor-fold>
public:
static void rV(std::vector<Vehicle *> &vehicles) {
long VIN, vID = 0;
std::cout << "VIN:\n>> ", std::cin >> VIN;
if (fV(vehicles, VIN) >= 0) vID = fV(vehicles, VIN); else Quit();
vehicles.erase(vehicles.begin() + std::distance(vehicles.begin(), vehicles.begin() + vID));
}
static void gV(std::vector<Vehicle *> &vehicles, bool search) {//FIXME Fix bug related to non full printing
long VIN;
if (search) {
std::cout << "VIN:\n>> ", std::cin >> VIN;
pV(*vehicles.at(fV(vehicles, VIN)));
} else pV(*vehicles.at(0));
}
static void aeV(std::vector<Vehicle *> &vehicles, bool editMode) {
//<editor-fold desc="VarsDecl">
auto *v = new Vehicle();
int VIN, amountofobjects;
//</editor-fold>
//<editor-fold desc="VIN">
std::cout << "VIN:\n>> ", std::cin >> VIN;
VIN >= 0 ? v->setVIN(VIN) : Quit();
//</editor-fold>
//<editor-fold desc="Doors">
std::cout << "Amount of doors:\n>> ", std::cin >> amountofobjects;
if (amountofobjects < 0) Quit();
for (int i = 0; i < amountofobjects; ++i) {
Vehicle::Door door{};
bool dIsOpen;
std::cout << "Is door open?\n>> ", std::cin >> dIsOpen;
if (!std::cin.fail()) {
door.setIsOpen(dIsOpen);
v->doors.push_back(door);
} else Quit();
}
//</editor-fold>
//<editor-fold desc="Windows">
std::cout << "Amount of windows:\n>> ", std::cin >> amountofobjects;
if (amountofobjects < 0) Quit();
for (int i = 0; i < amountofobjects; ++i) {
Vehicle::Window window{};
bool wIsOpen;
double lengthOpen;
std::cout << "Is window open?:\n>> ", std::cin >> wIsOpen;
!std::cin.fail() ? window.setIsOpen(wIsOpen) : Quit();
if (wIsOpen == 1) std::cout << "How much window is open?\n>> ", std::cin >> lengthOpen; else lengthOpen = 0;
if (lengthOpen >= 0) {
window.setLengthOpen(lengthOpen);
v->windows.push_back(window);
} else Quit();
}
//</editor-fold>
//<editor-fold desc="Pedals">
std::cout << "Amount of pedals:\n>> ", std::cin >> amountofobjects;
if (amountofobjects < 0) Quit();
for (int i = 0; i < amountofobjects; ++i) {
Vehicle::Pedal pedal{};
bool pIsPress;
double pressForce;
std::cout << "Is pedal pressed?:\n>> ", std::cin >> pIsPress;
if (pIsPress && !std::cin.fail()) {
std::cout << "How much pedal is pressed?\n>> ", std::cin >> pressForce;
if (!std::cin.fail() && pressForce >= 0) {
pedal.setPressForce(pressForce);
v->pedals.push_back(pedal);
} else Quit();
} else !std::cin.fail() ? pedal.setPressForce(0) : Quit();
}
//</editor-fold>
//<editor-fold desc="Lights">
std::cout << "Amount of lights:\n>> ", std::cin >> amountofobjects;
if (amountofobjects < 0) Quit();
for (int i = 0; i < amountofobjects; ++i) {
Vehicle::Light light{};
bool lIsOn;
std::cout << "Is light on?\n>> ", std::cin >> lIsOn;
if (!std::cin.fail()) {
light.setIsOn(lIsOn);
v->lights.push_back(light);
} else Quit();
}
//</editor-fold>
//<editor-fold desc="SteeringWheel">
double swAngle;
std::cout << "How much steering wheel is turned?\n>> ", std::cin >> swAngle;
swAngle >= 0 && swAngle <= 360 ? v->steeringWheel.setAngle(swAngle) : Quit();
//</editor-fold>
//<editor-fold desc="Transmission">
std::cout << "Amount of speeds in transmission:\n>> ", std::cin >> amountofobjects;
if (amountofobjects < 0) Quit();
for (int i = 0; i < amountofobjects; ++i) {
Vehicle::Transmission::Speed speed{};
char speedValue;
bool isSetOnThisSpeed;
std::cout << "Speed: \n>> ", std::cin >> speedValue;
std::cout << "Is set on this speed?: \n>> ", std::cin >> isSetOnThisSpeed;
if (!std::cin.fail()) {
speed.setSpeed(speedValue);
speed.setIsSetOnThisSpeed(isSetOnThisSpeed);
v->transmission.speeds.push_back(speed);
} else Quit();
}
//</editor-fold>
//<editor-fold desc="Add/Edit">
pV(*v);
bool approvedByUser;
std::cout << "\nAre you satisfied?\n>> ", std::cin >> approvedByUser;
if (approvedByUser)
if (editMode)
std::replace(vehicles.begin(), vehicles.end(), vehicles.at(fV(vehicles, v->getVIN())), v);
else
vehicles.emplace_back(v);//TODO Fix adding
else Quit();
delete v;
//</editor-fold>
}
};
#endif //ATOMPBLIESOOPDB_MAINWRAPPER_H
Vehicle.hpp:
#ifndef ATOMPBLIESOOPDB_VEHICLE_H
#define ATOMPBLIESOOPDB_VEHICLE_H
#include <vector>
class Vehicle {
public:
class Window {
bool isOpen;
double lengthOpen;
public:
bool checkIsOpen() const {
return isOpen;
}
void setIsOpen(bool setIsOpen) {
Window::isOpen = setIsOpen;
}
double getLengthOpen() const {
return lengthOpen;
}
void setLengthOpen(double setLengthOpen) {
Window::lengthOpen = setLengthOpen;
}
};
class Door {
bool isOpen;
public:
bool checkIsOpen() const {
return isOpen;
}
void setIsOpen(bool setIsOpen) {
Door::isOpen = setIsOpen;
}
};
class Pedal {
bool isPressed;
double pressForce;
public:
bool checkIsPressed() const {
return isPressed;
}
void setIsPressed(bool setIsPressed) {
Pedal::isPressed = setIsPressed;
}
double getPressForce() const {
return pressForce;
}
void setPressForce(double setPressForce) {
Pedal::pressForce = setPressForce;
}
};
class Light {
bool isOn;
public:
bool checkIsOn() const {
return isOn;
}
void setIsOn(bool setIsOn) {
Light::isOn = setIsOn;
}
};
class SteeringWheel {
double angle;
public:
double getAngle() const {
return angle;
}
void setAngle(double setAngle) {
angle = setAngle;
}
};
class Transmission {
public:
class Speed {
char speed;
bool isSetOnThisSpeed;
public:
void setIsSetOnThisSpeed(bool setIsSetOnThisSpeed) {
isSetOnThisSpeed = setIsSetOnThisSpeed;
}
bool checkIsSetOnThisSpeed() const {
return isSetOnThisSpeed;
}
char getSpeed() const {
return speed;
}
void setSpeed(char setSpeed) {
Speed::speed = setSpeed;
}
};
std::vector<Speed> speeds;
};
int VIN;
int getVIN() const {
return VIN;
}
void setVIN(int vin) {
VIN = vin;
}
std::vector<Door> doors;
std::vector<Pedal> pedals;
std::vector<Light> lights;
Transmission transmission;
std::vector<Window> windows;
SteeringWheel steeringWheel;
};
#endif //ATOMPBLIESOOPDB_VEHICLE_H
main.cpp:
#include <iostream>
#include <vector>
#include "MainWrapper.h"
#define RED "\033[31m"
int main() {
std::vector<Vehicle *> vehicles;
char option;
while (true) {
std::cout << "G - get info about vehicle\nA - add new vehicle\nR - remove vehicle\n";
std::cout << "E - edit info about vehicle\nC - clear terminal\nQ - quit the program\n";
std::cout << "VIN - vehicle unique number\n>>";
std::cin >> option;
switch (option) {
default://fine
std::cout << "Invalid input!";
return -1;
case 'C':
std::system("cls");
break;
case 'Q'://fine
return 0;
case 'E'://fine
MainWrapper::aeV(vehicles, true);
break;
case 'R'://fine
MainWrapper::rV(vehicles);
break;
case 'G'://FIXME
MainWrapper::gV(vehicles, true);
break;
case 'A'://fine
MainWrapper::aeV(vehicles, false);
break;
}
}
}