Форум программистов, компьютерный форум CyberForum.ru

Создать класс адрес - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
garikkk1
-51 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 44
09.03.2011, 22:35     Создать класс адрес #1
застрял на этой теме! спасите пожалуйста!
классы и объекты в с++

адрес
страна-char*
город-char*
улица-char*
номер дома-int

 Комментарий модератора 
В следующий раз кричащее выделение текста будет наказываться
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.03.2011, 22:54     Создать класс адрес #2
garikkk1, Сотни раз ведь на форуме было...
Ну да ладно. Вспомню char*...

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
#include <iostream>
#include <cstring>
 
class Addr
{
public:
    Addr(char* country_="Russia", 
        char* town_="Moscow",
        char* street_="Arbat",
        int h_n=40)
    {
        country=new char[strlen(country_)+1];
        strcpy(country, country_);
        town=new char[strlen(town_)+1];
        strcpy(town, town_);
        street=new char[strlen(street_)+1];
        strcpy(street, street_);
        h_number=h_n;
    }
    ~Addr()
    {
        delete[] country;
        delete[] town;
        delete[] street;
    }
    void SetCountry(char* country_)
    {
        country=new char[strlen(country_)+1];
        strcpy(country, country_);
    }
    void SetTown(char* town_)
    {
        town=new char[strlen(town_)+1];
        strcpy(town, town_);
    }
    void SetStreet(char* street_)
    {
        street=new char[strlen(street_)+1];
        strcpy(street, street_);
    }
    void SetHNumber(int h_n)
    {
        h_number=h_n;
    }
    void SetAddr(char* country_, char* town_, char* street_, int h_n)
    {
        SetCountry(country_);
        SetTown(town_);
        SetStreet(street_);
        SetHNumber(h_n);
    }
    char* GetCountry() const
    {
        return country;
    }
    char* GetTown() const
    {
        return town;
    }
    char* GetStreet() const
    {
        return street;
    }
    int GetHNumber() const
    {
        return h_number;
    }
private:
    char* country;
    char* town;
    char* street;
    int h_number;
};
 
int main()
{
    Addr new_addr;
    std::cout<<new_addr.GetCountry()<<'\n'<<
        new_addr.GetTown()<<'\n'<<
        new_addr.GetStreet()<<'\n'<<
        new_addr.GetHNumber()<<'\n';
    return 0;
}
garikkk1
-51 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 44
09.03.2011, 23:00  [ТС]     Создать класс адрес #3
ОГРОМНОЕ спасибо! сейчас ток проверю!

Добавлено через 3 минуты
пару недочетов но пустяки главное суть уловил!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.03.2011, 23:03     Создать класс адрес #4
garikkk1, А недочеты можно сказать?) Даже интересно стало)
garikkk1
-51 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 44
09.03.2011, 23:07  [ТС]     Создать класс адрес #5
1) не все библиотеки
2) вывод не останавливается
3) я сделал ввод с клавы улицы страны и т.д

говорю пустяки ))

можешь немного комментариев вставить пожалуйсто
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.03.2011, 23:11     Создать класс адрес #6
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
#include <iostream>
#include <cstring>
 
class Addr
{
public:
//Конструктор. Можно использовать и по умолчанию и с параметрами
        Addr(char* country_="Russia", 
                char* town_="Moscow",
                char* street_="Arbat",
                int h_n=40)
        {
//Выделяем память.
                country=new char[strlen(country_)+1];
//Копируем.
                strcpy(country, country_);
                town=new char[strlen(town_)+1];
                strcpy(town, town_);
                street=new char[strlen(street_)+1];
                strcpy(street, street_);
                h_number=h_n;
        }
//Деструктор. Очищаем память.
        ~Addr()
        {
                delete[] country;
                delete[] town;
                delete[] street;
        }
//Раздел сеттеров (установка значений в поля, принцип тот же что и в конструкторе, 
//выделяем память (копируем), тут еще можно везде удаление впринципе вставить, но этим 
//займись сам.
        void SetCountry(char* country_)
        {
                country=new char[strlen(country_)+1];
                strcpy(country, country_);
        }
        void SetTown(char* town_)
        {
                town=new char[strlen(town_)+1];
                strcpy(town, town_);
        }
        void SetStreet(char* street_)
        {
                street=new char[strlen(street_)+1];
                strcpy(street, street_);
        }
        void SetHNumber(int h_n)
        {
                h_number=h_n;
        }
        void SetAddr(char* country_, char* town_, char* street_, int h_n)
        {
                SetCountry(country_);
                SetTown(town_);
                SetStreet(street_);
                SetHNumber(h_n);
        }
//Раздел геттеров. Для получения значения поля.
        char* GetCountry() const
        {
                return country;
        }
        char* GetTown() const
        {
                return town;
        }
        char* GetStreet() const
        {
                return street;
        }
        int GetHNumber() const
        {
                return h_number;
        }
private:
        char* country;
        char* town;
        char* street;
        int h_number;
};
 
int main()
{
        Addr new_addr;
        std::cout<<new_addr.GetCountry()<<'\n'<<
                new_addr.GetTown()<<'\n'<<
                new_addr.GetStreet()<<'\n'<<
                new_addr.GetHNumber()<<'\n';
        return 0;
}
garikkk1
-51 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 44
09.03.2011, 23:16  [ТС]     Создать класс адрес #7
напомни надо вроде вставить куда-то (стрелочку)
указатель_на_объект_класса -> имя элемента

и что значит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
                country=new char[strlen(country_)+1];
                strcpy(country, country_);
        }
        void SetTown(char* town_)
        {
                town=new char[strlen(town_)+1];
                strcpy(town, town_);
        }
        void SetStreet(char* street_)
        {
                street=new char[strlen(street_)+1];
                strcpy(street, street_);
        }
        void SetHNumber(int h_n)
        {
                h_number=h_n;
        }
Добавлено через 1 минуту
C++
1
 country=new char[strlen(country_)+1]
вот +1 что значит сдесь
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.03.2011, 23:26     Создать класс адрес #8
garikkk1, strlen возвращает длину строки без завершающего ноль-символа. а новую строку хотелось бы получить с нулем в конце. Поэтому +1 символ)
garikkk1
-51 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 44
09.03.2011, 23:28  [ТС]     Создать класс адрес #9
а что такое - геттеры и сеттеры?
и зачем вместо одной переменной писать- h_n?
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1330 / 863 / 50
Регистрация: 02.01.2009
Сообщений: 2,621
Записей в блоге: 1
09.03.2011, 23:39     Создать класс адрес #10
ForEveR, Поро такой маленький совет слышал? : "Где только можно используйте const" (От греха подальше.. =) )
garikkk1
-51 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 44
09.03.2011, 23:45  [ТС]     Создать класс адрес #11
Цитата Сообщение от ISergey Посмотреть сообщение
ForEveR, Поро такой маленький совет слышал? : "Где только можно используйте const" (От греха подальше.. =) )
я не понял вместо чего ты собрался подставлять const
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1330 / 863 / 50
Регистрация: 02.01.2009
Сообщений: 2,621
Записей в блоге: 1
10.03.2011, 00:18     Создать класс адрес #12
Цитата Сообщение от garikkk1 Посмотреть сообщение
я не понял вместо чего ты собрался подставлять const
Не вместо, а где....
C++
1
2
3
4
5
....
Addr(const char* country_="Russia", const char* town_="Moscow", const char* street_="Arbat" ...
....
const char* GetCountry() const
....
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.03.2011, 00:26     Создать класс адрес #13
ISergey, Да протупил. В конструкторе. Да и в сетерах по сути)

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
#include <iostream>
#include <cstring>
 
class Addr
{
public:
//Конструктор. Можно использовать и по умолчанию и с параметрами
        Addr(const char* country_="Russia", 
                const char* town_="Moscow",
                const char* street_="Arbat",
                const int h_n=40)
        {
//Выделяем память.
                country=new char[strlen(country_)+1];
//Копируем.
                strcpy(country, country_);
                town=new char[strlen(town_)+1];
                strcpy(town, town_);
                street=new char[strlen(street_)+1];
                strcpy(street, street_);
                h_number=h_n;
        }
//Деструктор. Очищаем память.
        ~Addr()
        {
                delete[] country;
                delete[] town;
                delete[] street;
        }
//Раздел сеттеров (установка значений в поля, принцип тот же что и в конструкторе, 
//выделяем память (копируем), тут еще можно везде удаление впринципе вставить, но этим 
//займись сам.
        void SetCountry(const char* country_)
        {
                country=new char[strlen(country_)+1];
                strcpy(country, country_);
        }
        void SetTown(const char* town_)
        {
                town=new char[strlen(town_)+1];
                strcpy(town, town_);
        }
        void SetStreet(const char* street_)
        {
                street=new char[strlen(street_)+1];
                strcpy(street, street_);
        }
        void SetHNumber(const int h_n)
        {
                h_number=h_n;
        }
        void SetAddr(const char* country_, const char* town_, const char* street_, const int h_n)
        {
                SetCountry(country_);
                SetTown(town_);
                SetStreet(street_);
                SetHNumber(h_n);
        }
//Раздел геттеров. Для получения значения поля.
        const char* GetCountry() const
        {
                return country;
        }
        const char* GetTown() const
        {
                return town;
        }
        const char* GetStreet() const
        {
                return street;
        }
        const int GetHNumber() const
        {
                return h_number;
        }
private:
        char* country;
        char* town;
        char* street;
        int h_number;
};
 
int main()
{
        Addr new_addr;
        std::cout<<new_addr.GetCountry()<<'\n'<<
                new_addr.GetTown()<<'\n'<<
                new_addr.GetStreet()<<'\n'<<
                new_addr.GetHNumber()<<'\n';
        return 0;
}
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1330 / 863 / 50
Регистрация: 02.01.2009
Сообщений: 2,621
Записей в блоге: 1
10.03.2011, 00:28     Создать класс адрес #14
Здесь не нужно.
C++
1
 const int h_n=40
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.03.2011, 00:30     Создать класс адрес #15
ISergey, Не критично) По сути не нужно, но пускай будет)
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
10.03.2011, 01:17     Создать класс адрес #16
ForEveR, а где конструктор копий и оператор присваивания? И почему все твои сеттеры не освобождают ранее выделенную память?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.03.2011, 01:50     Создать класс адрес #17
rangerx, Потому что писал наспех))
Если доводить до ума, то копир, присваивание, слежка за памятью конечно нужны.

Добавлено через 26 минут
Я думаю теперь можно сказать, что программа доведена до ума?)

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
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
 
class Addr
{
public:
//Конструктор. Можно использовать и по умолчанию и с параметрами
        Addr()
        {
            Default_Init();
        }
        Addr(const char* country_, 
                const char* town_,
                const char* street_,
                const int h_n)
        {
//Выделяем память.
                country=new char[strlen(country_)+1];
//Копируем.
                strcpy(country, country_);
                town=new char[strlen(town_)+1];
                strcpy(town, town_);
                street=new char[strlen(street_)+1];
                strcpy(street, street_);
                h_number=h_n;
        }
        Addr(const Addr& other)
        {
                country=new char[strlen(other.country)+1];
                strcpy(country, other.country);
                town=new char[strlen(other.town)+1];
                strcpy(town, other.town);
                street=new char[strlen(other.street)+1];
                strcpy(street, other.street);
                h_number=other.h_number;
        }
//Деструктор. Очищаем память.
        ~Addr()
        {
                delete[] country;
                delete[] town;
                delete[] street;
        }
        Addr& operator =(const Addr& other)
        {
            if(this == &other)
                return *this;
            delete[] country;
            delete[] town;
            delete[] street;
            country=new char[strlen(other.country)+1];
            strcpy(country, other.country);
            town=new char[strlen(other.town)+1];
            strcpy(town, other.town);
            street=new char[strlen(other.street)+1];
            strcpy(street, other.street);
            h_number=other.h_number;
            return *this;
        }
//Раздел сеттеров (установка значений в поля, принцип тот же что и в конструкторе, 
//выделяем память (копируем), тут еще можно везде удаление впринципе вставить, но этим 
//займись сам.
        void SetCountry(const char* country_)
        {
                delete[] country;
                country=new char[strlen(country_)+1];
                strcpy(country, country_);
        }
        void SetTown(const char* town_)
        {
                delete[] town;
                town=new char[strlen(town_)+1];
                strcpy(town, town_);
        }
        void SetStreet(const char* street_)
        {
                delete[] street;
                street=new char[strlen(street_)+1];
                strcpy(street, street_);
        }
        void SetHNumber(const int h_n)
        {
                h_number=h_n;
        }
        void SetAddr(const char* country_, const char* town_, const char* street_, const int h_n)
        {
                SetCountry(country_);
                SetTown(town_);
                SetStreet(street_);
                SetHNumber(h_n);
        }
//Раздел геттеров. Для получения значения поля.
        const char* GetCountry() const
        {
                return country;
        }
        const char* GetTown() const
        {
                return town;
        }
        const char* GetStreet() const
        {
                return street;
        }
        const int GetHNumber() const
        {
                return h_number;
        }
private:
        char* country;
        char* town;
        char* street;
        int h_number;
 
        void Default_Init()
        {
                const char* def_country="Russia";
                const char* def_town="Moscow";
                const char* def_street="Arbat";
                const int def_h_number=40;
 
                country=new char[strlen(def_country)+1];
                strcpy(country, def_country);
                town=new char[strlen(def_town)+1];
                strcpy(town, def_town);
                street=new char[strlen(def_street)+1];
                strcpy(street, def_street);
                h_number=def_h_number;
        }
};
 
std::ostream& operator <<(std::ostream& os, const Addr& one)
{
    os<<one.GetCountry()<<'\n'<<
        one.GetTown()<<'\n'<<
        one.GetStreet()<<'\n'<<
        one.GetHNumber()<<'\n';
    return os;
}
 
std::istream& operator >>(std::istream& is, Addr& one)
{
    const int max_size=256;
    char str[max_size];
    is.getline(str, max_size);
    char* country=new char[strlen(str)+1];
    strcpy(country, str);
    is.getline(str, max_size);
    char* town=new char[strlen(str)+1];
    strcpy(town, str);
    is.getline(str, max_size);
    char* street=new char[strlen(str)+1];
    strcpy(street, str);
    int h_n=0;
    is>>h_n;
    is.get();
    one.SetAddr(country, town, street, h_n);
    return is;
}
 
int main()
{
    std::vector<Addr> advec((std::istream_iterator<Addr>(std::cin)), std::istream_iterator<Addr>());
    std::copy(advec.begin(), advec.end(), std::ostream_iterator<Addr>(std::cout, "\n"));
    return 0;
}
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
10.03.2011, 02:49     Создать класс адрес #18
Цитата Сообщение от ForEveR Посмотреть сообщение
Я думаю теперь можно сказать, что программа доведена до ума?)
К чему придраться всё же есть.
1) Конструктор с параметрами по умолчанию убирать было вовсе не обязятельно
2) Дублирование кода:
C++
1
2
3
 // код такого вида повторяется очень часто 
street=new char[strlen(street_)+1];
strcpy(street, street_);
C++
1
2
3
delete[] country;
delete[] town;
delete[] street;
3) И если уж действительно доводить до ума, то исключение, которое может выбросить оператор new в конструкторе тоже не мешало бы обработать, иначе будет утечка(для неуспешно созданных объектов деструкторы не вызываются).
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.03.2011, 16:23     Создать класс адрес #19
rangerx, Ну да. Тоже верно.
1) Подумал, что так будет логичнее)
2) Да, функцию для этого написать было бы неплохо.
3) Ммм... Да. Стоит отлавливать, спасибо)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2011, 20:41     Создать класс адрес
Еще ссылки по теме:

Создать класс RIELTER, с полями в закрытой части: количество комнат, этаж; площадь; адрес C++
Создать класс "ведомость абитуриентов" (ФИО, адрес, оценки по трем предметам) C++
C++ Создать класс и класс-потомок с полями

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

Или воспользуйтесь поиском по форуму:
garikkk1
-51 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 44
10.03.2011, 20:41  [ТС]     Создать класс адрес #20
так какой из всех выше перечисленных вариантов является правильным?
Yandex
Объявления
10.03.2011, 20:41     Создать класс адрес
Ответ Создать тему
Опции темы

Текущее время: 14:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru