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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
YourLastSong
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
#1

Использование собственного класса строк - C++

15.01.2012, 23:22. Просмотров 3075. Ответов 67
Метки нет (Все метки)

Здравствуйте, уважаемые господа.

Есть реализация собственного класса строк:

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
class MyString
{
    private:
        size_t length;
        char *str;
 
    public:
        MyString ();
        MyString (const char *c);
        MyString (const MyString& t);
        ~MyString ();
 
        MyString& operator= (const MyString& t);
        MyString operator+ (const MyString& t) const;
        MyString operator+ (const char *c) const;
        bool operator== (const MyString& t) const;
        bool operator!= (const MyString& t) const;
        void operator+= (const MyString& t);
        char& operator[] (size_t i);
 
        char& at (size_t i);
        void get_input (std::istream& in);
        size_t size () const;
        size_t get_length () const;
 
        friend std::ostream& operator<< (std::ostream& out, const MyString& t);
        friend std::istream& operator>> (std::istream& in, MyString& t);
};
 
MyString::MyString ()
{
    length = 0;
    str = NULL;
}
 
MyString::MyString (const char *c)
{
    length = strlen (c) + 1;
    str = new char[length];
    strcpy (str, c);
    str[length-1] = '\0';
}
 
MyString::MyString (const MyString& t)
{
    length = strlen (t.str) + 1;
    str = new char[length];
    strcpy (str, t.str);
    str[length-1] = '\0';
}
 
MyString::~MyString ()
{
    if (str != NULL)
    {
        delete[] str;
    }
}
 
MyString& MyString::operator= (const MyString& t)
{
    length = strlen (t.str) + 1;
    str = new char[length];
    strcpy (str, t.str);
    str[length-1] = '\0';
 
    return *this;
}
 
MyString MyString::operator+ (const MyString& t) const
{
    char* newStr = new char[strlen (str) + strlen (t.str) + 1];
    strcpy (newStr, str);
    strcat (newStr, t.str);
    newStr[length-1] = '\0';
 
    MyString returnObj (newStr);
    delete[] newStr;
 
    return returnObj;
}
 
bool MyString::operator== (const MyString& t) const
{
    return (strcmp(str, t.str) == 0);
}
 
bool MyString::operator!= (const MyString& t) const
{
    return (strcmp(str, t.str) != 0);
}
 
void MyString::operator+= (const MyString& t)
{
    length = strlen (str) + strlen (t.str) + 1;
    char *newStr = new char[length];
    strcpy (newStr, str);
    strcat (newStr, t.str);
    strcpy (str, newStr);
    str[length-1] = '\0';
    delete[] newStr;
}
 
char& MyString::operator[] (size_t i)
{
    return str[i];
}
 
char& MyString::at (size_t i)
{
    if (i >= 0 && i < length)
    {
        return str[i];
    }
}
 
void MyString::get_input (std::istream& in)
{
    while (true)
    {
        char c = in.get ();
 
        if (c == '\n')
        {
            break;
        }
 
        if (length == 0)
        {
            length = 2;
        }
        else
        {
            ++length;
        }
 
        char* newStr = new char[length];
        if (str != NULL)
        {
            strcpy (newStr, str);
        }
        newStr[length-2] = c;
        newStr[length-1] = '\0';
 
        delete[] str;
 
        str = newStr;
    }
}
 
size_t MyString::size () const
{
    return length;
}
 
size_t MyString::get_length () const
{
    if (length == 0)
    {
        return 0;
    }
    else
    {
        return (length - 1);
    }
}
 
std::ostream& operator<< (std::ostream& out, const MyString& t)
{
    out << t.str;
    return out;
}
 
std::istream& operator>> (std::istream& in, MyString& t)
{
    t.get_input (in);
    return in;
}
Всё ли здесь так, как надо?

Что бы вы предложили добавить сюда и каким образом?

Заранее благодарю за возможные ответы.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2012, 23:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование собственного класса строк (C++):

Запись в собственного класса бинарный файл собственного - C++
есть Свой тип данных дробь. Надо реализовать запись и загрузку в\из бинарного файла. #ifndef RATION_H #define RATION_H #include...

Использование собственного функтора со связывателями - C++
Не могу правильно написать функтор, чтобы его можно было использовать с биндом. Вот пример на сравнение строк без учета регистра: ...

Создание собственного класса - C++
Создать класс для работы со стеком, организованным как связный однонаправленный список. В классе описать методы добавления элемента в стек...

Ввод и вывод строки собственного класса - C++
Добрый вечер. Пишу свой класс строк, беда в том, что во вводе что-то, видимо, не так..В общем, строка вводится, но не выводится:( Все...

Увеличение размера массива из элементов собственного класса - C++
Добрый день, столкнулся с проблемой, у меня есть собственный класс myClass{ myClass(){ len = 0; ii = new...

Создание списка объектов собственного класса (SQL) - C++
очень нужно! объясните, пожалуйста, доходчиво, а лучше с примером, как создать список из объектов класса, к примеру, &quot;human&quot;, используя...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.01.2012, 22:51 #31
YourLastSong, что значит "вылетает"? Если вылетает, значит скомпилировалась, и значит, что с точки зрения компилятора всё верно. Если программа падает - смотрите в свой алгоритм.
0
YourLastSong
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
19.01.2012, 23:08  [ТС] #32
C++
1
2
3
4
MyString operator+(const MyString& left, const MyString& right)
{
    return MyString(left) += right;
}
Так делать нельзя:

binary 'operator +' has too many parameters
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
19.01.2012, 23:10 #33
Цитата Сообщение от YourLastSong Посмотреть сообщение
C++
1
2
3
4
MyString operator+(const MyString& left, const MyString& right)
{
    return MyString(left) += right;
}
Так делать нельзя:
потому что он не должен быть членом класса
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.01.2012, 23:13 #34
YourLastSong, вам уже 10 раз сказали: сделайте оператор + внешней функцией! Вы читаете то, что вам пишут?
0
YourLastSong
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
19.01.2012, 23:14  [ТС] #35
потому что он не должен быть членом класса
Спасибо.

У вас есть открытый оператор индексации
Проверять каждый элемент отдельно?

Не получается реализовать bool operator!= (const char *c, const MyString& t).

C++
1
2
3
4
bool operator!= (const char *c, const MyString& t)
{
    return (strcmp (c, t.str) != 0);
}
К сожалению, он не понимает, какой именно оператор == надо вызывать в данном случае.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.01.2012, 23:17 #36
YourLastSong, напишите метод а-ля std::string::c_str. Тогда не понадобится доступ к закрытому полю str.

Добавлено через 42 секунды
Цитата Сообщение от YourLastSong Посмотреть сообщение
он не понимает, какой именно оператор == надо вызывать
Ошибка какая?

Добавлено через 54 секунды
YourLastSong, а вообще, оператор != реализуется через уже написанный operator== так:
C++
1
2
3
4
bool operator!=(const Foo& left, const Foo& right)
{
    return !(left == right);
}
0
retmas
19.01.2012, 23:20
  #37

Не по теме:

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

1
silent_1991
19.01.2012, 23:21
  #38

Не по теме:

retmas, полностью согласен, в сообщении 34 последняя моя фраза подтверждает моё согласие

0
YourLastSong
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
19.01.2012, 23:24  [ТС] #39
напишите метод а-ля std::string::c_str. Тогда не понадобится доступ к закрытому полю str.
char* MyString::c_str ()
{
return str;
}
Или надо делать по-другому?
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.01.2012, 23:25 #40
YourLastSong, так.
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
19.01.2012, 23:32 #41
C++
1
2
3
4
const char* MyString::c_str () const
{
    return str;
}
так
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.01.2012, 23:33 #42
retmas, или даже так?
C++
1
2
3
4
const char* MyString::c_str () const
{
    return str;
}
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
19.01.2012, 23:34 #43
да) копипаст всему виной)
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.01.2012, 23:35 #44
retmas, а я вообще сначала только на return str; глянул))
0
YourLastSong
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
19.01.2012, 23:51  [ТС] #45
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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
class MyString
{
    private:
        size_t length;
        char *str;
 
        void from_c_str (const char *other);
 
    public:
        MyString ();
        MyString (const char *c);
        MyString (const MyString& t);
        ~MyString ();
 
        MyString& operator= (const MyString& t);
        MyString& operator= (const char *c);
        MyString& operator+= (const MyString& t);
        char& operator[] (size_t i);
        const char& operator[] (size_t i) const;
 
        char& at (size_t i);
        const char& at (size_t i) const;
        void getline (std::istream& in);
        size_t get_length () const;
        const char* c_str () const;
 
        friend std::ostream& operator<< (std::ostream& out, const MyString& t);
        friend std::istream& operator>> (std::istream& in, MyString& t);
 
        friend bool operator< (const MyString& t, const char *c);
        friend bool operator< (const MyString& t, const MyString& t1);
        friend bool operator< (const char *c, const MyString& t);
 
        friend bool operator<= (const MyString& t, const char *c);
        friend bool operator<= (const MyString& t, const MyString& t1);
        friend bool operator<= (const char *c, const MyString& t);
 
        friend bool operator> (const MyString& t, const char *c);
        friend bool operator> (const MyString& t, const MyString& t1);
        friend bool operator> (const char *c, const MyString& t);
 
        friend bool operator>= (const MyString& t, const char *c);
        friend bool operator>= (const MyString& t, const MyString& t1);
        friend bool operator>= (const char *c, const MyString& t);
};
 
MyString::MyString ()
{
    length = 1;
    str = new char[length];
    *str = '\0';
}
 
MyString::MyString (const char *c)
{
    from_c_str (c);
}
 
MyString::MyString (const MyString& t)
{
    from_c_str (t.str);
}
 
MyString::~MyString ()
{
    delete[] str;
}
 
MyString& MyString::operator= (const MyString& t)
{
    if (this == &t)
    {
        return *this;
    }
    from_c_str (t.str);
 
    return *this;
}
 
MyString& MyString::operator= (const char *c)
{
    from_c_str (c);
 
    return *this;
}
 
MyString operator+ (const MyString& left, const MyString& right)
{
    return MyString(left) += right;
}
 
bool operator== (const MyString& t, const MyString& t1)
{
    return (strcmp(t.c_str(), t1.c_str()) == 0);
}
 
bool operator!= (const MyString& t, const MyString& t1)
{
    return !(operator== (t, t1));
}
 
bool operator< (const MyString& t, const char *c)
{
    return ((t.get_length () < strlen (c)) ? true : false);
}
 
bool operator< (const MyString& t, const MyString& t1)
{
    return ((t.get_length () < t1.get_length ()) ? true : false);
}
 
bool operator< (const char *c, const MyString& t)
{
    return ((strlen (c) < t.get_length ()) ? true : false);
}
 
bool operator<= (const MyString& t, const char *c)
{
    return ((t.get_length () <= strlen (c)) ? true : false);
}
 
bool operator<= (const MyString& t, const MyString& t1)
{
    return ((t.get_length () <= t1.get_length ()) ? true : false);
}
 
bool operator<= (const char *c, const MyString& t)
{
    return ((strlen (c) <= t.get_length ()) ? true : false);
}
 
bool operator> (const MyString& t, const char *c)
{
    return ((t.get_length () > strlen (c)) ? true : false);
}
 
bool operator> (const MyString& t, const MyString& t1)
{
    return ((t.get_length () > t1.get_length ()) ? true : false);
}
 
bool operator> (const char *c, const MyString& t)
{
    return ((strlen (c) > t.get_length ()) ? true : false);
}
 
bool operator>= (const MyString& t, const char *c)
{
    return ((t.get_length () >= strlen (c)) ? true : false);
}
 
bool operator>= (const MyString& t, const MyString& t1)
{
    return ((t.get_length () >= t1.get_length ()) ? true : false);
}
 
bool operator>= (const char *c, const MyString& t)
{
    return ((strlen (c) >= t.get_length ()) ? true : false);
}
 
MyString& MyString::operator+= (const MyString& t)
{
    length = strlen (str) + strlen (t.str) + 1;
    char *newStr = new char[length];
    strcpy (newStr, str);
    strcat (newStr, t.str);
    strcpy (str, newStr);
    str[length-1] = '\0';
    delete[] newStr;
 
    return *this;
}
 
char& MyString::operator[] (size_t i)
{
    return str[i];
}
 
const char& MyString::operator[] (size_t i) const
{
    return str[i];
}
 
char& MyString::at (size_t i)
{
    if (str != NULL && i >= 0 && i < length)
    {
        return str[i];
    }
    else
    {
        throw std::out_of_range ("wrong index");
    }
}
 
const char& MyString::at (size_t i) const
{
    if (str != NULL && i >= 0 && i < length)
    {
        return str[i];
    }
    else
    {
        throw std::out_of_range ("wrong index");
    }
}
 
void MyString::getline (std::istream& in)
{
    while (true)
    {
        char c = in.get ();
 
        if (c == '\n')
        {
            break;
        }
 
        if (length == 0)
        {
            length = 2;
        }
        else
        {
            ++length;
        }
 
        char* newStr = new char[length];
        if (str != NULL)
        {
            strcpy (newStr, str);
        }
        newStr[length-2] = c;
        newStr[length-1] = '\0';
 
        delete[] str;
 
        str = newStr;
    }
}
 
size_t MyString::get_length () const
{
    return (length - 1);
}
 
void MyString::from_c_str (const char *c)
{
    length = strlen (c) + 1;
    delete[] str;
    str = new char[length];
    strcpy (str, c);
}
 
const char* MyString::c_str () const
{
    return str;
}
 
std::ostream& operator<< (std::ostream& out, const MyString& t)
{
    out << t.str;
    return out;
}
 
std::istream& operator>> (std::istream& in, MyString& t)
{
    t.getline (in);
    return in;
}
Из того, что только что поменял, есть недочёты?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2012, 23:51
Привет! Вот еще темы с ответами:

Использование в качестве поля класса указатель на объект другого класса - C++
Ошибка в названии - &quot;указателЯ&quot; Вот, пытаюсь освоить ООП (пока только учусь): создаю класс person (человек) и car (модель машины). ...

Использование объекта одного класса при создании нового класса - C++
Добрый вечер. У меня такая проблема. Есть готовый класс L2 - список, на его основе нужно создать дек. Я поступил так: в приватной части...

Std::vector добавить новый элемент собственного класса без использования конструктора копирования - C++
Всем привет! Есть один класс, который я хочу хранить в std::vector. Создать массив, с типом своего класса, грубо говоря. Естественно,...

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса - C++
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса для объекта производного класса, если...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.01.2012, 23:51
Ответ Создать тему
Опции темы

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