Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
3 / 2 / 1
Регистрация: 30.03.2018
Сообщений: 64
1

Реализация класса Человек

16.10.2018, 15:53. Показов 494. Ответов 9
Метки нет (Все метки)

Условия:
Определить класс Person (Персона) со следующими элементами-данными:
o name - имя персоны, динамический строку
o address - адрес, динамический строку
o age - возраст, целое
o phoneNumber - телефонный номер, динамический строку.

Класс должен содержать следующие функции элементы:
o Аксесоры (accessors, getters)-функции доступа к полям класса
o мутаторов (mutators, setters) - функции для установки полей класса
o Конструктор по умолчанию
o Конструктор с одним параметром (строкой), который будет работать как конструктор преобразования
o Конструктор копии
o Деструктор

Продемонстрировать работу класса.
Продемонстрировать на примере работу конструктора копии и конструктора преобразования. (кому не трудно допишите пожалуйста, не очень понимаю как)
И нужно реализувать main


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
#include <iostream>
#include <string>
using namespace std;
 
class Person {
private:
    int age;
    char *name;
    char *address;
    char *phoneNumber;
public:
    Person() : name(0), age(18), address(0), phoneNumber(0) {}
    Person(char *name) : name(0)
    {
        setName(name);
    }
    Person(char *name, int age, char *address, char *phoneNumber)
    {
        setAge(age);
        setName(name);
        setAddress(address);
        setPhoneNumber(phoneNumber);
    }
    void setName(char *name)
    {
        delete[]this->name;
        this->name = strcpy(new char[strlen(name) + 1], name);
    }
    char *getName() const
    {
        return name;
    }
    void setAddress(char *address)
    {
        delete[]this->address;
        this->address = strcpy(new char[strlen(address) + 1], address);
    }
 
    char *getAddress() const
    {
        return address;
    }
    int getAge() const
    {
        return age;
    }
    void setAge(int age)
    {
        this->age = age;
    }
    char setPhoneNumber(char *phoneNumber)
    {
        delete[]this->phoneNumber;
        this->phoneNumber = strcpy(new char[strlen(phoneNumber) + 1], phoneNumber);
    }
    void *getPhoneNumber()const
    {
        return phoneNumber;
    }
    ~Person()
    {
        delete[] name;
        delete[] address;
        delete[] phoneNumber;
    }
};
int main()
{
    /* char name[10];
    int age;
    char address[15];
    char phoneNumber[15];
    cout << "Enter the name: ";
    cin >> name;
    cout << "Enter age: ";
    cin >> age;
    cout << "Enter your address: ";
    cin >> address;
    cout << "Enter phoneNumber: ";
    cin >> phoneNumber;
    Person A;
    A.setName(name);
    A.setAge(age);
    A.setAddress(address);
    A.setPhoneNumber(phoneNumber);
    return 0; */
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2018, 15:53
Ответы с готовыми решениями:

Реализация класса на базе класса Stack с возможностью !индексирования!
Помогите пожалуйста!!! Нужно реализовать на базе класса stack другой класс с возможностью...

Оператор преображения для класса Человек
class Person { int age; char *name; char *address; char *phoneNumber; public: ......

Имеется список класса (все имена разные). Определить есть ли в классе человек который побывал в гостях у всего класса
Имеется список класса (все имена разные). Определить есть ли в классе человек который побывал в...

Реализация точки доступа в кафе для 15 человек
Здравствуйте, друзья! В чем заключается вопрос. У меня есть кафе и мне нужно реализовать точку...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
9
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
16.10.2018, 17:14 2
Цитата Сообщение от julia_B Посмотреть сообщение
C++
1
delete[]this->name;
а если в name мусор?
Цитата Сообщение от julia_B Посмотреть сообщение
C++
1
strcpy(new char[strlen(name) + 1], name);
новый вид извращений?))
Цитата Сообщение от julia_B Посмотреть сообщение
конструктора копии
C++
1
2
3
4
5
6
Person(const Person& otherPerson)
{
    this->age = otherPerson.age;
    this->name = otherPerson.name;
    и так далее
}
Цитата Сообщение от julia_B Посмотреть сообщение
конструктора преобразования
я так понимаю он уже у вас есть
Цитата Сообщение от julia_B Посмотреть сообщение
И нужно реализувать main
ну дык вызываете и все
C++
1
2
Person person1;
person1.getName();
Цитата Сообщение от julia_B Посмотреть сообщение
C++
1
void *getPhoneNumber()const
интересно-интересно, это мне еще надо знать к какому типу кастить?
1
3 / 2 / 1
Регистрация: 30.03.2018
Сообщений: 64
16.10.2018, 22:47  [ТС] 3
В итоге код вот такого вида(припустим). Компилятор выдаёт ошибку((

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
#include <iostream>
#include <string>
using namespace std;
 
class Person {
private:
    int age;
    char *name;
    char *address;
    char *phoneNumber;
public:
    Person() : name(0), age(18), address(0), phoneNumber(0) {}
    Person(char *name) : name(0)
    {
        setName(name);
    }
    Person(char *name, int age, char *address, char *phoneNumber)
    {
        setAge(age);
        setName(name);
        setAddress(address);
        setPhoneNumber(phoneNumber);
    }
    Person(const Person& otherPerson)
    {
        this->age = otherPerson.age;
        this->name = otherPerson.name;
        this->address = otherPerson.address;
        this->phoneNumber = otherPerson.phoneNumber;
    }
    void setName(char *name)
    {
        delete[]this->name;
        this->name = strcpy(new char[strlen(name) + 1], name);
    }
    char *getName() const
    {
        return name;
    }
    void setAddress(char *address)
    {
        delete[]this->address;
        this->address = strcpy(new char[strlen(address) + 1], address);
    }
 
    char *getAddress() const
    {
        return address;
    }
    int getAge() const
    {
        return age;
    }
    void setAge(int age)
    {
        this->age = age;
    }
    char setPhoneNumber(char *phoneNumber)
    {
        delete[]this->phoneNumber;
        this->phoneNumber = strcpy(new char[strlen(phoneNumber) + 1], phoneNumber);
    }
    void *getPhoneNumber()const
    {
        return phoneNumber;
    }
    ~Person()
    {
        delete[] name;
        delete[] address;
        delete[] phoneNumber;
    }
};
int main()
{
    Person person1;
    person1.getName();
 
}
0
3 / 2 / 1
Регистрация: 30.03.2018
Сообщений: 64
30.10.2018, 19:19  [ТС] 4
Azazel-San,
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
#include <iostream>
#include <string>
using namespace std;
 
class Person {
private:
    int age;
    string *name;
    string *address;
    string *phoneNumber;
public:
    Person() : name(0), age(0), address(0), phoneNumber(0) {}
 
    explicit Person(string *name) : name(0)
    {
        setName(*name);
    }
    Person(string *name, int age, string *address, string *phoneNumber)
    {
        setAge(age);
        setName(*name);
        setAddress(*address);
        setPhoneNumber(*phoneNumber);
    }
    Person(const Person & otherPerson)
    {
        this->age = otherPerson.age;
        this->name = otherPerson.name;
        this->address = otherPerson.address;
        this->phoneNumber = otherPerson.phoneNumber;
    }
    void setName(string n)
    {
        *name = n;
    }
    string *getName() const
    {
        return name;
    }
    void setAddress(string ad)
    {
        *address = ad;
    }
    string *getAddress() const
    {
        return address;
    }
    int getAge() const
    {
        return age;
    }
    void setAge(int age)
    {
        this->age = age;
    }
    void setPhoneNumber(string phNum)
    {
        *phoneNumber = phNum;
    }
    string *getPhoneNumber()const
    {
        return phoneNumber;
    }
    void print()const
    {
        cout << "Name - " << name << ", Age - " << age << ", Address - " << address << ", Number phone - " << phoneNumber << endl;
    }
    ~Person()
    {
        delete[] name;
        delete[] address;
        delete[] phoneNumber;
    }
};
//string func(Person person)
//{
//  cout << "Name - " << person.name << endl;
//}
int main()
{
    Person A;
    A.setName("Julia");
    A.setAge(18);
    A.setAddress("Rovenskaya,39");
    A.setPhoneNumber("+380982732000");
    A.print();
 
    Person B=A;
    B.setName("Alex");
    B.setPhoneNumber("+380677828000");
    B.print();
    return 0;
}
Подскажите пожалуйста почему не выводит даже сообщение? Компилятор в VS2017
0
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
30.10.2018, 23:35 5
Цитата Сообщение от julia_B Посмотреть сообщение
C++
1
2
3
string *name;
string *address;
string *phoneNumber;
Зачем вам указатели на std::string ? Это вам не char'ы.
Цитата Сообщение от julia_B Посмотреть сообщение
C++
1
2
3
4
explicit Person(string *name) : name(0)
{
 setName(*name);
}
Лучше не стоит так делать и вызывать сеттер в конструкторе. и почему только name(0) инициализируете? А остальные что? Не заслужили?))
Цитата Сообщение от julia_B Посмотреть сообщение
C++
1
2
3
4
void setName(string n)
{
 *name = n;
}
Почему вы решили что так можно делать? Это UB.
У вас *name nullptr, а вы ему временный объект подсовываете. И так везде у вас.
Цитата Сообщение от julia_B Посмотреть сообщение
C++
1
2
3
4
5
6
7
Person(const Person & otherPerson)
{
 this->age = otherPerson.age;
 this->name = otherPerson.name;
 this->address = otherPerson.address;
 this->phoneNumber = otherPerson.phoneNumber;
}
А здесь уже без сеттеров, изменяете стилю
Цитата Сообщение от julia_B Посмотреть сообщение
C++
1
2
3
4
5
6
~Person()
{
 delete[] name;
 delete[] address;
 delete[] phoneNumber;
}
Ну, а вы память выделяли? Нет. Тогда что вы освобождаете?
Цитата Сообщение от julia_B Посмотреть сообщение
Подскажите пожалуйста почему не выводит даже сообщение?
Цитата Сообщение от julia_B Посмотреть сообщение
C++
1
2
3
4
A.setName("Julia");
A.setAge(18);
A.setAddress("Rovenskaya,39");
A.setPhoneNumber("+380982732000");
Ну соответственно нет, у вас очень много ошибок, лишние указатели, передача не по ссылке, ненужные вызовы внутри конструкторов, которые только ухудшают читабельность и дебаг, ну и тд, рефакторите, почитайте возможно сначала о std::string и чем он отличается от массива charов, используйте везде где только можно константность и ссылки. Ещё о конструкторах, списке инициализаций и работе динамической памяти, а лучше с ней не работать, используйте стек и будет вам радость а если уж и работаете то ВАМ рекомендую умные указатели, от греха подальше)

зы может что и забыл, но рефакторить много
0
3 / 2 / 1
Регистрация: 30.03.2018
Сообщений: 64
31.10.2018, 00:43  [ТС] 6
Azazel-San, в условиях задачи нужно использовать динамические строки, по этому и *
0
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
31.10.2018, 00:51 7
julia_B, тогда беда
0
3 / 2 / 1
Регистрация: 30.03.2018
Сообщений: 64
02.11.2018, 16:27  [ТС] 8
Azazel-San, уже можна через char, я с преподом договорилась )
0
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
02.11.2018, 17:05 9
julia_B, ну, у вас все еще много ошибок.
0
3 / 2 / 1
Регистрация: 30.03.2018
Сообщений: 64
10.12.2018, 21:08  [ТС] 10
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
#include <iostream>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
 
class Person {
private:
    int age;
    char *name ;
    char *address;
    char *phoneNumber;
 
    void ZeroAll()
    {
        name = address = phoneNumber = nullptr;
    }
 
public:
    void SetAll(char *name, int age, char *address, char *phoneNumber)
    {
        setAge(age);
        setName(name);
        setAddress(address);
        setPhoneNumber(phoneNumber);
    }
    Person()
    {
        ZeroAll();
        SetAll("Noname", 0, "No address","No phone");
    }
    Person(char *name)
    {
        ZeroAll();
        SetAll(name, 0, "No address","No phone");
    }
    Person(char *name, int age, char *address, char *phoneNumber)
    {
        ZeroAll();
        SetAll("Noname", 0, "No address","No phone");
    }
    Person(const Person & otherPerson)
    {
        ZeroAll();
        this->age = otherPerson.age;
        setName(otherPerson.name);
        setAddress(otherPerson.address);
        setPhoneNumber(otherPerson.phoneNumber);
    }
    void setName(char *name)
    {
        delete[]this->name;
        this->name = strcpy(new char[strlen(name) + 1], name);
    }
    char *getName() const
    {
        return name;
    }
    void setAddress(char *address)
    {
        delete[]this->address;
        this->address = strcpy(new char[strlen(address) + 1], address);
    }
    char *getAddress() const
    {
        return address;
    }
    int getAge() const
    {
        return age;
    }
    void setAge(int age)
    {
        this->age = age;
    }
    void setPhoneNumber(char *phoneNumber)
    {
        delete[]this->phoneNumber;
        this->phoneNumber = strcpy(new char[strlen(phoneNumber) + 1], phoneNumber);
    }
    void *getPhoneNumber()const
    {
        return phoneNumber;
    }
    void print()const
    {
        cout << "Name - " << name << ", Age - " << age << ", Address - " << address << ", Number phone - " << phoneNumber << endl;
    }
    ~Person()
    {
        cout << "Dter to work" << endl;
        delete[] name;
        delete[] address;
        delete[] phoneNumber;
    }
};
int main()
{
    int age;
    char name[10];
    char address[15];
    char phoneNumber[15];
    cout << "Enter the name: ";
    cin >> name;
    cout << "Enter age: ";
    cin >> age;
    cout << "Enter your address: ";
    cin >> address;
    cout << "Enter phoneNumber: ";
    cin >> phoneNumber;
    cout << endl;
 
    Person A;
    A.setName(name);
    A.setAge(age);
    A.setAddress(address);
    A.setPhoneNumber(phoneNumber);
    A.print();
 
    Person B = A;
    char name1[10];
    char phoneNumber1[15];
    cout << "Enter the name: ";
    cin >> name1;
    cout << "Enter phoneNumber: ";
    cin >> phoneNumber1;
    B.setName(name1);
    B.setPhoneNumber(phoneNumber1);
    B.print();
 
    return 0;
}
Не благодарите
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2018, 21:08

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Реализация работы с классами, конструктор, методы класса и переменные класса
Всем привет, решил изучать Java. Нашел прикольное задание : Реализовать класс, представляющий...

Реализация класса с свойствами - ссылками на объекты класса
Всем привет, пожалуйста подскажите реализацию такой интересной вещи, что написана в заголовке. Вот...

Создать производный от класса «Человек» класс «Путешественник»
Создать производный от класса «Человек» класс «Путешественник», содержащий следующие данные: •...

Описание класса TMan, создающего тип «Человек»
Здравствуйте,помогите с лабораторной ,только начал изучать язык,а требуют уже сейчас выполнить...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.