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

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

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

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

15.01.2012, 23:22. Просмотров 3041. Ответов 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;
}
Всё ли здесь так, как надо?

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.01.2012, 22:51     Использование собственного класса строк #31
YourLastSong, что значит "вылетает"? Если вылетает, значит скомпилировалась, и значит, что с точки зрения компилятора всё верно. Если программа падает - смотрите в свой алгоритм.
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
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;
}
Так делать нельзя:
потому что он не должен быть членом класса
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.01.2012, 23:13     Использование собственного класса строк #34
YourLastSong, вам уже 10 раз сказали: сделайте оператор + внешней функцией! Вы читаете то, что вам пишут?
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);
}
К сожалению, он не понимает, какой именно оператор == надо вызывать в данном случае.
silent_1991
Эксперт С++
4960 / 3036 / 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);
}
retmas
19.01.2012, 23:20
  #37

Не по теме:

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

silent_1991
19.01.2012, 23:21
  #38

Не по теме:

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

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;
}
Или надо делать по-другому?
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.01.2012, 23:25     Использование собственного класса строк #40
YourLastSong, так.
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;
}
так
silent_1991
Эксперт С++
4960 / 3036 / 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;
}
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
19.01.2012, 23:34     Использование собственного класса строк #43
да) копипаст всему виной)
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.01.2012, 23:35     Использование собственного класса строк #44
retmas, а я вообще сначала только на return str; глянул))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2012, 23:51     Использование собственного класса строк
Еще ссылки по теме:

Степенной метод нахождения наибольшего по модулю собственного значения и соответствующего ему собственного вектора - C++
Привет всем. Есть код программы, но почему то он не работает, подскажите в чем дело, может ввожу неправильно. Тестовый пример: ...

Использование класса - C++
Доброго времени суток! Подскажите пожалуйста... Я как-то неправильно использую класс: #include &lt;windows.h&gt; class Timer { ...

Использование дружественного класса - C++
Нужно что бы классы стали общее дружеские вложенные классы поидее в книге написано можно добавить всего лишь к примеру friend class Remote;...

Использование класса ORDER - C++
Следующие задания требуется решить с использованием классов. При этом обязательно оформить методы для выполнения каждого из действий: по...

Использование this в методе класса - C++
Добрый день! Пытаюсь написать класс красно-чёрного дерева. Вот фрагмент класса: class Tree { long value; Tree* parent; ...


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

Или воспользуйтесь поиском по форуму:
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;
}
Из того, что только что поменял, есть недочёты?
Yandex
Объявления
19.01.2012, 23:51     Использование собственного класса строк
Ответ Создать тему
Опции темы

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