Ошибка при попытке получить сведения о машине

Есть программа, представляющая собой некую базу данных о автомобилях. Можно создать машину в базе данных (команда 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;
        }
    }
}

Ответы (0 шт):