Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/75: Рейтинг темы: голосов - 75, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 03.07.2018
Сообщений: 19
1

Создать классы Дом, Квартира и Человек

14.12.2018, 12:10. Показов 13618. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создайте программу, имитирующую многоквартирный
дом. Необходимо иметь классы «Человек», «Квартира»,
«Дом». Класс «Квартира» содержит динамический массив
объектов класса «Человек». Класс «Дом» содержит массив
объектов класса «Квартира».
В общем столкнулся с проблемой соединения всех классов в общие данные.Не могу найти взаимосвязь между классами для вывода данных в main().
Как в классе "Человек" использовать данные других классов,допустим номер квартиры ,который хранится в классе квартира,адрес дома из класса "Дом"???И в других классах соответственно класс "человек".
И чтобы не было каши если создавать несколько объектов класса "Дом"?
Часть кода

occupant.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#pragma once
class Occupant
{
    char *name;
    char* surname;
    char* phone;
    int* number;
 
public:
    Occupant(char*name,char*surname,char*phone);
 
    void setName(char *str);
    void setSurname(char *str);
    void setPhone(char *str);
    
 
    char* getName() { return this->name; }
    char* getSurname() { return this->surname; }
    char* getPhone() { return this->phone; }
    
 
    // Конструктор копирования
    Occupant(const Occupant&other);
 
 
    void clear(char *str) {
        if (str != nullptr) {
            delete str;
        }
    }
 
 
    // вывод данных
    void Print(Occupant a);
    //ввод данных
    void Input(char*name);
 
    void Input(char*surname);
    void Input(char*phone);
    
    ~Occupant();
};


Occupant.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "Occupant.h"
#include "Stdafx.h"
#include "House.h"
 
 
Occupant::Occupant(char*name, char*surname, char*phone)
{
    this->name = name;
    this->surname = surname;
    this->phone = phone;
}
 
void Occupant::setName(char * str)
{
    clear(this->name);
    this->name = new char[strlen(str) + 1];
    strcpy_s(this->name, strlen(str) + 1, str);
}
 
void Occupant::setSurname(char * str) 
{
    clear(this->surname);
    this->surname = new char[strlen(str) + 1];
    strcpy_s(this->surname, strlen(str) + 1, str);
}
 
void Occupant::setPhone(char * str)
{
    clear(this->phone);
    this->phone = new char[strlen(str) + 1];
    strcpy_s(this->phone, strlen(str) + 1, str);
}
 
 
// конструктор копирования
Occupant::Occupant(const Occupant & other)
{
    this->name = other.name;
    this->surname = other.surname;
    this->phone = other.phone;
 
    this->name = new char[strlen(other.name) + 1];
    strcpy_s(this->name, strlen(other.name) + 1, other.name);
 
    this->surname = new char[strlen(other.surname) + 1];
    strcpy_s(this->surname, strlen(other.surname) + 1, other.surname);
 
    this->phone = new char[strlen(other.phone) + 1];
    strcpy_s(this->phone, strlen(other.phone) + 1, other.phone);
 
}
// ввод
void Occupant::Input(char* name)
{
    char in[80];
    cout << " Введите Имя ";
    gets_s(in, 80);
    this->setName(in);
}
 
 
 
void Occupant::Input(char*surname)
{
    char in[80];
    cout << " Введите Фамилию ";
    gets_s(in, 80);
    this->setSurname(in);
}
 
 
void Occupant::Input(char*phone)
{
    char in[80];
    cout << " Введите Имя ";
    gets_s(in, 80);
    this->setPhone(in);
}
 
// вывод
void Occupant::Print(Occupant a)
{
    cout << "Фамилия  " << surname << endl;
    cout << "Имя " << name << endl;
    cout << "Номер телефона " << phone << endl;
    
}
 
// деструктор
Occupant::~Occupant()
{
    delete[] name;
    delete[] surname;
    delete[] phone;
 
    cout << "Class occupant bye bye" << endl;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2018, 12:10
Ответы с готовыми решениями:

Запрос с параметрами Улица, Дом, Квартира, Жители
Добрый день! Сейчас делаю запрос с параметрами: Улица, Дом, Квартира, Жители. Надо, когда...

Вложенность типов адресса: улица, дом, квартира
Добрый вечер. Есть json строка, я пытаюсь разложить ее по типу: для каждой улицы свои дома, для...

Выбор данных в связанных списках Улица, Дом, Квартира
Всем привет! Помогите, пожалуйста, реализовать выборку данных. На форме Выборка с полями...

Опишите, используя структуру записи, данные о студентах (фамилия, улица, дом, квартира)
Помогите составить программу: Опишите, используя структуру записи, данные о студентах (фамилия,...

18
1 / 1 / 0
Регистрация: 03.07.2018
Сообщений: 19
21.12.2018, 11:28  [ТС] 2
Пока никто не пишет,закину еще пару классов.
Flat.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include "Occupant.h"
#include "House.h"
class Flat
{
    int size;     // кол-во жильцов в одной квартире
    Occupant* flats; // массив объектов класса Occupant жильцы
public:
 
    Flat();
    int GetSize() { return this->size; }  //геттер
    void SetSize(int);                     // сеттер
 
    void AddOccupant();         //Создает временного пользователя, и выводит форму для ввода данных(View) 
    void SaveOccupant(Occupant a); // добавляет пользователя в массив
 
    ~Flat();
};
Добавлено через 2 минуты
Flat.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "Flat.h"
#include "Occupant.h"
#include "Stdafx.h"
 
 
Flat::Flat()
{
    this->size = 0;
}
 
void Flat::SaveOccupant(Occupant a)
{
    if (this->size == 0) {
        this->flats = new Occupant[1];
    }
    else 
    {
        Occupant* buffer;
        buffer = new Occupant[this->size];
        for (int i = 0; i < this->size; i++) {
            buffer[i] = this->flats[i];
        }
        this->flats = new Occupant[this->size + 1];
        for (int i = 0; i < this->size; i++) {
            this->flats[i] = buffer[i];
        }
    }
 
    this->flats[this->size] = a; // - красивая запись
 
    this->size++;
 
}
 
void Flat::SetSize(int size)
{
    this->size = size;
}
 
void Flat::AddOccupant()
{
    Occupant tmp;
    tmp.Input();
    this->SaveOccupant(tmp);
 
}
 
 
Flat::~Flat()
{
    delete[] flats;
}
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
21.12.2018, 11:31 3
Цитата Сообщение от Kobzarko Посмотреть сообщение
Как в классе "Человек" использовать данные других классов,допустим номер квартиры ,который хранится в классе квартира,адрес дома из класса "Дом"???
Ну об этом должны были Вы как программист и позаботится. Вариантов есть несколько, но для начала наверное хотелось бы увидеть сам класс "Человек" или Occupant - это и есть он?
0
1 / 1 / 0
Регистрация: 03.07.2018
Сообщений: 19
21.12.2018, 11:37  [ТС] 4
А вот в классе Дом уже использовать схему кода класса Flat не получается.
Не инициализируются методы и объекты класса Flat.
То есть хочу использовать принцип матрешки, а не получается..
Объект класса жильца в класс квартира(в квартире то могут жить и несколько человек).
А объект класса квартира влаживаем в массив класса дом .По сути только их перечисляя.Ну и вывод либо через метод либо в main() через цикл do while и switch.
Вот такая логика.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
21.12.2018, 11:39 5
Цитата Сообщение от Kobzarko Посмотреть сообщение
C++
1
clear(this->surname);
Например здесь у вас вообще потенциальное UB, кто дает гарантию что до этой строчки ваше поле surname не содержит мусор? Тогда что вы попытаетесь удалить? А еще смущает поле int* number; - зачем и почему это указатель?
0
1 / 1 / 0
Регистрация: 03.07.2018
Сообщений: 19
21.12.2018, 11:43  [ТС] 6
класс Occupant это и есть класс человек.
Немного его изменил добавил конструктор с параметрами объекта класса
Occupant.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#pragma once
#include <iostream>
using namespace std;
class Occupant
{
    char *name;
    char* surname;
    char* phone;
    
public:
 
    
    Occupant();
    Occupant(Occupant&in);
    /*Occupant(char*name,char*surname,char*phone);*/
 
    // сеттеры
    void setName(char *str);
    void setSurname(char *str);
    void setPhone(char *str);
    
    // геттеры
    char* getName() { return this->name; }
    char* getSurname() { return this->surname; }
    char* getPhone() { return this->phone; }
    
 
    // Конструктор копирования
    Occupant(const Occupant&other);
 
    // очищение памяти
    void clear(char * str);
 
    //ввод данных
    void Input();
 
    // вывод данных
    void Print();
    
 
    
    ~Occupant();
};
Добавлено через 1 минуту
Occupant.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "Occupant.h"
#include "Stdafx.h"
#include "House.h"
 //конструктор по умолчанию
Occupant::Occupant()
{
}
 
//конструктор с параметрами
//Occupant::Occupant(char*name, char*surname, char*phone)
//{ 
//  this->name = name;
//  this->surname = surname;
//  this->phone = phone;
//
//}
 
Occupant::Occupant(Occupant&in)  //объект класса
{
    
    this->setName(in.getName());
    this->setSurname(in.getSurname());
    this->setPhone(in.getPhone());
}
 
 
// сеттеры
void Occupant::setName(char * str)
{
    clear(this->name);
    this->name = new char[strlen(str) + 1];
    strcpy_s(this->name, strlen(str) + 1, str);
}
 
void Occupant::setSurname(char * str) 
{
    clear(this->surname);
    this->surname = new char[strlen(str) + 1];
    strcpy_s(this->surname, strlen(str) + 1, str);
}
 
void Occupant::setPhone(char * str)
{
    clear(this->phone);
    this->phone = new char[strlen(str) + 1];
    strcpy_s(this->phone, strlen(str) + 1, str);
}
 
 
 //конструктор копирования
Occupant::Occupant(const Occupant & other)
{
    this->name = other.name;
    this->surname = other.surname;
    this->phone = other.phone;
 
    this->name = new char[strlen(other.name) + 1];
    strcpy_s(this->name, strlen(other.name) + 1, other.name);
 
    this->surname = new char[strlen(other.surname) + 1];
    strcpy_s(this->surname, strlen(other.surname) + 1, other.surname);
 
    this->phone = new char[strlen(other.phone) + 1];
    strcpy_s(this->phone, strlen(other.phone) + 1, other.phone);
 
}
 
 
void Occupant::clear(char * str)
{
    if (str != nullptr) {
        delete str;
    }
}
 
// ввод
void Occupant::Input()
{
    char tmp[1024];
    cout << "\n------------------------------------------------";
    cout << "\n Введите данные жильца" << endl;
 
    cout << "Имя : "; gets_s(tmp, 1024);
    this->setName(tmp);
 
    cout << " Фамилия :"; gets_s(tmp, 1024);
    this->setSurname(tmp);
 
    cout << " Номер телефона:"; gets_s(tmp, 1024);
    this->setPhone(tmp);
 
}
 
    // вывод
void Occupant::Print()
{
    cout << "\nДанные жильца :  "<<endl;
    cout << "Фамилия  " << this->getSurname() << endl;
    cout << "Имя " << this->getName() << endl;
    cout << "Номер телефона " << this->getPhone() << endl;
    
}
 
 
 
 
// деструктор
Occupant::~Occupant()
{
    delete[] name;
    delete[] surname;
    delete[] phone;
 
    cout << "Class occupant bye bye" << endl;
}
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
21.12.2018, 11:45 7
Kobzarko, вот теперь точно будет UB, предыдущая версия с 1 конструктором была чуть вернее.
0
1 / 1 / 0
Регистрация: 03.07.2018
Сообщений: 19
21.12.2018, 11:46  [ТС] 8
Ну я только учусь ,так что и отталкиваюсь от отладчика не ругается значит хорошо.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
21.12.2018, 11:47 9
Kobzarko, по поводу
Цитата Сообщение от Kobzarko Посмотреть сообщение
использовать данные других классов
смотрите в сторону например агрегации/композиции
1
1 / 1 / 0
Регистрация: 03.07.2018
Сообщений: 19
21.12.2018, 11:47  [ТС] 10
Самое интересное что второй вариант нам препод давал))))
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
21.12.2018, 11:50 11
Цитата Сообщение от Kobzarko Посмотреть сообщение
Ну я только учусь
Ну у вас вообще не логично построены классы и взаемодействие с ними, знатоки сказали бы не по ООПешному, хотя может и вопрос использования ООП не стоял.
0
1 / 1 / 0
Регистрация: 03.07.2018
Сообщений: 19
21.12.2018, 11:59  [ТС] 12
Azazel-San, вот как раз ООП и изучаем.((

Добавлено через 5 минут
Azazel-San, хотя как по мне все логично.Меньший класс попадает в другой класс и соответственно в третий.
Но в тоже время я могу использовать их отдельно друг от друга (а может и не могу)

Добавлено через 53 секунды
Объе́ктно-ориенти́рованное программи́рование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования[1].
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
21.12.2018, 12:05 13
Kobzarko, ну для начала ваш последний премер вашего класса "Человек" не будет работать, по выше сказанным причинам. Второе это указатели которые делают что? А не понятно, они могут указывать на что-то и никто это не контролирует. Конструктор копирования, который делает что-то странное. Доступ к приватным полям класса и тд.
1
1 / 1 / 0
Регистрация: 03.07.2018
Сообщений: 19
21.12.2018, 14:17  [ТС] 14
Azazel-San, посоветуйте пожалуйста литературу либо какой нибудь видеоблог про ооп.А то вы меня немного озадачили.Нужно разобраться либо лыжи ,либо я.
0
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
21.12.2018, 14:37 15
Kobzarko, тык

Раздел "Object-oriented programming"
1
1 / 1 / 0
Регистрация: 03.07.2018
Сообщений: 19
21.12.2018, 15:36  [ТС] 16
Azazel-San, а что именно не так с указателями?Я использую указатели так как это строка и указатель на динамический массив длину которого я не знаю.
Или все таки стоит отказаться от их использования?
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
21.12.2018, 15:43 17
Kobzarko, с самими указателями все так, а вот с тем как вы их используете, не все так хорошо. Особенно когда вы работаете с кучей. У вас как минимум неверная инициализация и местами потенциальные утечки памяти, ну и как я говорил возможность изменить приватное поле класса.
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
22.12.2018, 11:23 18
Лучший ответ Сообщение было отмечено Kobzarko как решение

Решение

Цитата Сообщение от Kobzarko Посмотреть сообщение
а что именно не так с указателями?Я использую указатели так как это строка и указатель на динамический массив длину которого я не знаю.
Или все таки стоит отказаться от их использования?
Подправил твоего оккупанта:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include <iostream>
#include <stdlib.h>
#include <string.h>
 
class Occupant {
  // Добавим приставку m_ к именам полей,
  // так будем отличать своих от чужих ;)
  // Более подробно в:
  //  - http://habrahabr.ru/post/172091/
  char *m_name;
  char *m_surname;
  char *m_phone;
 
public:
  // Простой конструктор можно реализовать сразу при объявлении.
  //
  // Такой "странный" синтаксис означает:
  //   - до выполнения кода конструктора сделать:
  //     - m_name    равным nullptr
  //     - m_surname равным nullptr
  //     - m_phone   равным nullptr
  //
  // Замечание: nullptr пришёл к нам в С++11.
  //            Если его нет, то можно заменить его на NULL или 0.
  //            Но лучше включить поддержку C++11.
  //            https://www.cyberforum.ru/cpp-beginners/thread1874470.html
  //
  Occupant()
      : m_name(nullptr)
      , m_surname(nullptr)
      , m_phone(nullptr)
  {};
 
  // Конструктор с параметрами.
  // Не забываем про const!!!
  // Тогда мы имеем полное право писать:
  //   Occupant o("Ivan", "Petrov", "+79993334455");
  // Т.к. строка "Ivan" (и др.) - это константы.
  Occupant(const char *name, const char *surname, const char *phone);
 
  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  //
  // ПРАВИЛО ТРЁХ
  //  https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE_%D1%82%D1%80%D1%91%D1%85_(C%2B%2B)
  //
  // Если явно реализовали:
  //  - деструктор,
  //  - конструктор копирования или
  //  - оператор присваивания копированием.
  // То необходими реализовать и все оставшиеся.
 
  // Деструктор для очистки памяти
  ~Occupant();
 
  // Конструктор копирования
  Occupant(const Occupant &other);
 
  // Оператор присваивания копированием
  Occupant & operator=(const Occupant &other);
 
  // P.S.
  // Начиная с C++11 появляется ПРАВИЛО ПЯТИ
  //  https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE_%D1%82%D1%80%D1%91%D1%85_(C%2B%2B)
  // "Но это уже совсем другая история"
 
  // Сеттеры:
  //
  // Не забываем про const
  // и красивые имена параметров.
  void setName(const char *name);
 
  void setSurname(const char *surname);
 
  void setPhone(const char *phone);
 
  // Геттеры:
  //
  // Не забываем про const:
  //
  // +-------- Возвращаем константную строку
  // |         которую нельзя менять!!!
  // |
  // |                    +---- Метка того, что этот метод не меняет объект.
  // |                    |     Без неё нельзя вызвать эти методы,
  // |                    |     если к нам пришёл const Occupant
  // |                    |     Например, в конструкторе копирования.
  // V                    V
  const char * getName() const
  {
    return m_name;
  }
 
  const char * getSurname() const
  {
    return m_surname;
  }
 
  const char * getPhone() const
  {
    return m_phone;
  }
 
  // Остальное к объекту не относиться.
  // Выносим их из класса.
};
 
// Вспомогательная функция очистки строки.
// Передаём двойной указатель,
// что бы могли напрямую работать с исходной переменной
// (задать исходной переменной значение nullptr).
static void clear_str(char **str)
{
  if (*str) {
    delete[] * str;
    *str = nullptr;
  }
}
 
// Вспомогательная функция копирования строки.
// ВНИМАНИЕ: Не проверяет пункт назначения.
// Передаём двойной указатель,
// что бы могли напрямую работать с исходной переменной.
static void unsafe_copy_str(char **dst, const char *src)
{
  size_t N = strlen(src) + 1;
  *dst     = new char[N];
  memcpy(*dst, src, N);
}
 
// Вспомогательная функция замены строки.
// Передаём двойной указатель,
// что бы могли напрямую работать с исходной переменной.
static void rewrite_str(char **dst, const char *src)
{
  clear_str(dst);
  unsafe_copy_str(dst, src);
}
 
Occupant::Occupant(const char *name, const char *surname, const char *phone)
{
  unsafe_copy_str(&m_name, name);
  unsafe_copy_str(&m_surname, surname);
  unsafe_copy_str(&m_phone, phone);
}
 
Occupant::~Occupant()
{
  clear_str(&m_name);
  clear_str(&m_surname);
  clear_str(&m_phone);
}
 
Occupant::Occupant(const Occupant &other)
{
  unsafe_copy_str(&m_name, other.getName());
  unsafe_copy_str(&m_surname, other.getSurname());
  unsafe_copy_str(&m_phone, other.getPhone());
}
 
Occupant & Occupant::operator=(const Occupant &other)
{
  rewrite_str(&m_name, other.getName());
  rewrite_str(&m_surname, other.getSurname());
  rewrite_str(&m_phone, other.getPhone());
  return *this;
}
 
void Occupant::setName(const char *name)
{
  rewrite_str(&m_name, name);
}
 
void Occupant::setSurname(const char *surname)
{
  rewrite_str(&m_surname, surname);
}
 
void Occupant::setPhone(const char *phone)
{
  rewrite_str(&m_phone, phone);
}
 
void long_print(const Occupant &occupant)
{
  const char *name = occupant.getName();
  if (!name) name = "";
  const char *surname = occupant.getSurname();
  if (!surname) surname = "";
  const char *phone = occupant.getPhone();
  if (!phone) phone = "";
  std::cout << "Name: " << name << ", ";
  std::cout << "Surname: " << surname << ", ";
  std::cout << "Phone: " << phone << std::endl;
}
 
int main()
{
  Occupant o = Occupant("Ivan", "Petrov", "+79993334455");
  long_print(o);
  return 0;
}
Получилось много буковок.

Но в С++ для строк есть std::string:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <string>
 
class Occupant {
  // В С++ есть класс std::string
  std::string m_name;
  std::string m_surname;
  std::string m_phone;
 
public:
  Occupant(const std::string &name,
           const std::string &surname,
           const std::string &phone)
      : m_name(name)
      , m_surname(surname)
      , m_phone(phone)
  {
  }
 
 
  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  //
  // ПРАВИЛО НУЛЯ
  //  https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE_%D1%82%D1%80%D1%91%D1%85_(C%2B%2B)
  //
  // И нам не надо думать о деструкторе и прочем.
 
  void setName(const std::string &name)
  {
    m_name = name;
  }
 
  void setSurname(const std::string &surname)
  {
    m_surname = surname;
  }
 
  void setPhone(const std::string &phone)
  {
    m_phone = phone;
  }
 
  const std::string &getName() const
  {
    return m_name;
  }
 
  const std::string &getSurname() const
  {
    return m_surname;
  }
 
  const std::string &getPhone() const
  {
    return m_phone;
  }
};
 
 
void long_print(const Occupant &occupant)
{
  std::cout << "Name: " << occupant.getName() << ", ";
  std::cout << "Surname: " << occupant.getSurname() << ", ";
  std::cout << "Phone: " << occupant.getPhone() << std::endl;
}
 
Occupant read_occupant() {
  std::string name;
  std::string surname;
  std::string phone;
 
  std::cout << "Please, enter occupant fields:\n";
  std::cout << "Name: ";
  std::getline(std::cin, name);
  std::cout << "Surname: ";
  std::getline(std::cin, surname);
  std::cout << "Phone: ";
  std::getline(std::cin, phone);
 
  return Occupant(name, surname, phone);
}
 
int main()
{
  Occupant o1 = Occupant("Ivan", "Petrov", "+79993334455");
  Occupant o2 = read_occupant();
 
  long_print(o1);
  long_print(o2);
 
  return 0;
}
Что быстрее написать?
Первый вариант исключительно в образовательных целях, пока не усвоите правило трёх/пяти/нуля в С++
3
1 / 1 / 0
Регистрация: 03.07.2018
Сообщений: 19
22.12.2018, 19:40  [ТС] 19
AlexVRud, спасибо большое за столь конкретный материал.О правилах вообще первый раз слышу.
0
22.12.2018, 19:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2018, 19:40
Помогаю со студенческими работами здесь

Описать, используя структуру данных запись, данные на учеников (фамилия, улица, дом, квартира)
Описать, используя структуру данных запись, данные на учеников (фамилия, улица, дом, квартира)....

Текстовые файлы: Дан файл f, содержащий сведения об учениках (фамилия, улица, дом, квартира)
Здравствуйте,помогите пожалуйста справится с задачей. Дан файл f, содержащий сведения об учениках...

Описать, используя структуру, почтовую сортировку (город, улица, дом, квартира, кому, ценность)
Описать, используя структуру, почтовую сортировку (город, улица, дом, квартира, кому, ценность)....

Преобразовать строку, записав адрес прававильно: <область>, <нас. пункт>, <улица>, <дом / квартира>, <индекс>
Строка, содержит почтовый адрес, произвольной формы. Преобразовать строку, записав адрес...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru