Почему у меня вылетает программа когда я ввожу данные студента?

209
09 января 2019, 15:40

Задача у меня была вот в чём: Создайте программу, имитирующую многоквартирный дом. Необходимо иметь классы “Человек”, “Квартира”, “Дом”. Класс “Квартира” содержит динамический массив объектов класса “Человек”. Класс “Дом” содержит массив объектов класса “Квартира”.

Каждый из классов содержит переменные-члены и функции-члены, которые необходимы для предметной области класса. Обращаем ваше внимание, что память под строковые значения выделяется динамически. Например, для ФИО в классе “Человек”. Не забывайте обеспечить классы различными конструкторами (конструктор копирования обязателен), деструкторами. В main протестировать работу полученного набора классов.

Мой код: 
main.cpp 
#include "stdafx.h"
#include <iostream>
#include <string>
#include "Humen.h"
#include "House.h"
#include "Apartment.h"
using namespace std;
void main() {

    char answer = 'y';
    int action;
    string address;
    string number;
    int quantity_ap;
    int quantity_house;
    int counter = 0;
    House house;
    Apartment apartment;
    while (answer = 'y') {
        if (counter == 0) {
            cout << "Enter the name of the house : ";
            cin >> address;
            cout << "Введите размер дома: ";
            cin >> quantity_house;
            cout << "Введите имя квартиры : ";
            cin >> number;
            cout << "Введите размер квартиры: ";
            cin >> quantity_ap;
            if (!cin) {
                cout << "\nWrong number!\n";
                break;
            }
            House house1(address, quantity_house);
            house = house1;
            Apartment apartment1(number, quantity_ap);
            apartment = apartment1;
            cout << "Choose the action: \n\t1 - Посмотреть все дома\n\t2 - Посмотреть все квартиры\n\t3 - Добавить человека\n\t4 - Посмотреть подробности о человеке ";
            cin >> action;
            if (!cin) {
                cout << "\nWrong number!\n";
                break;
            }
            switch (action) {
            case 1:
                house.ShowHouse();
                break;
            case 2:
                apartment.ShowApartment();
                break;
            case 3:
            {
                cout << "\nEnter student number: ";
                int humen_number;
                cin >> humen_number;
                if (!cin) {
                    cout << "\nWrong number!\n";
                    break;
                }
                cout << "\nStudent's name:";
                string name;
                cin >> name;
                cout << "\nStudent's last_name:";
                string last_name;
                cin >> last_name;
                if (!cin) {
                    cout << "\nWrong number!\n";
                    break;
                }
                cout << "\nStudent's patronymic:";
                string patronymic;
                cin >> patronymic;
                if (!cin) {
                    cout << "\nWrong number!\n";
                    break;
                }
                Humen humen(name, last_name, patronymic, humen_number);
                apartment.setHumen(humen, humen_number);
            }
            break;
            case 4:
                int num;
                cout << "Enter the number of student";
                cin >> num;
                if (!cin) {
                    cout << "\nWrong number!\n";
                    break;
                }
                apartment.showThisHumen(num);
                break;
            default:
                cout << "Wrong number";
                break;
            }
            counter++;
            cout << "Go on?y/n\n";
            cin >> answer;
        }

    }

    system("pause");
}
Apartment.h 
#pragma once
#include "Humen.h"
#include <string>
using namespace std;
class Apartment
{
private:
    string number;
    Humen *humen;
    int size;
public:
    Apartment() {}
    Apartment(string number, int size) {
        size = size;
        humen = new Humen[this->size];
        this->number = number;
    }

    void ShowApartment() {
        cout << "\nNumber apartament:" << this->number << endl;
        for (int i = 0; i < size; i++) {
            cout << "[" << i << "]" << humen[i].getname() << endl;
        }
    }
    string getnumber() {
        return number;
    }
    void setHumen(Humen newHumen, int nomer) {
        this->humen[nomer] = newHumen;
    }
    void showThisHumen(int id) {
        this->humen[id].showHumen();
    }
};
House.h
#include "Apartment.h"
#include <string>
using namespace std;
class House
{
private:
    string address;
    Apartment *apartment;
    int size_h;
public:
    House() {}
    House(string address, int size) {
        size = size;
        apartment = new Apartment[this->size_h];
        this->address = address;
    }
    void ShowHouse() {
        cout << "\nNumber House:" << this->address << endl;
        for (int i = 0; i < size_h; i++) {
            cout << "(" << i << ")" << apartment[i].getnumber() << endl;
        }
    }
    void setApartment(Apartment newApartment, int nomer_house) {
        this->apartment[nomer_house] = newApartment;
    }
    void showThisApartment(int idex) {
        this->apartment[idex].ShowApartment();
    }
};
Humen.h
#pragma once
#include <iostream>
#include <string>

using namespace std;
class Humen
{
private:
    string name;
    string last_name;
    string patronymic;
    int humen_number;
public:
    Humen() {
    }
    Humen(string name, string last_name_, string patronymic, int humen_number) {
        this->name = name;
        this->last_name = last_name_; 
        this->patronymic = patronymic;
        this->humen_number = humen_number;;
    }
    string getname() {
        return name;
    }
    string getlast_name() {
        return last_name;
    }
    string getpatronymic() {
        return patronymic;
    }
    string gethumen_number() {
        return patronymic;
    }

    void setname(string name) {
        this->name = name;
    }
    void setlast_name(string last_name) {
        this->last_name = last_name;
    }
    void setPatronymic(string patronymic) {
        this->patronymic = patronymic;
    }
    void sethumen_number(int humen_number) {
        this->humen_number = humen_number;
    }
    void showHumen() {
        cout << "Name: " << this->name << endl;
        cout << "last_name: " << this->last_name << endl;
        cout << "Patronymic: " << this->patronymic << endl;
        cout << "Humen_number: " << this->humen_number << endl;
    }
};
[![введите сюда описание изображения][1]][1]

  [1]: https://i.stack.imgur.com/3Ta5c.png
Answer 1

Цикл while не сравнивает, а присваивает:

while (answer = 'y') {

Проверка первой записи закрывает весь код цикла, он ничего делать не будет.

while (answer == 'y') {
  if (counter == 0) {
    тело цикла
    } }

Вы обнуляете все записи при присваивании в цикле:

Apartment apartment1(number, quantity_ap);
apartment = apartment1;

apartment имеет значение как у последней записи.

READ ALSO
Почему ошибка Run-Time Check Failure #2 - Stack around the variable &#39;var&#39; was corrupted.

Почему ошибка Run-Time Check Failure #2 - Stack around the variable 'var' was corrupted.

По завершению работы функции выдает ошибку

171
Поиск повторений через map

Поиск повторений через map

Решал задачу, суть которой было найти максимальное количество повторенийПосле решения задачи посмотрел предложенный вариант её решения

176
Найти количество дубликатов в std::map

Найти количество дубликатов в std::map

Как найти количество дубликатов в map?

167
список указателей на объекты и удаление из списка

список указателей на объекты и удаление из списка

Как получить доступ к ним по итератору, чтобы можно было удалять объект из коллекции? struct Base { virtual void doit() { cout << "Base!\n"; } virtual...

170