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

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

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

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

15.01.2012, 23:22. Просмотров 3145. Ответов 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;, используя...

67
YourLastSong
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
16.01.2012, 18:30  [ТС] #16
Спасибо.

Класс нужен лишь для собственного изучения и прекрасно знаю о том, что такие вещи уже давно реализовали другие люди, причём гораздо более умные. Сам лично использую 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
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
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 char *c);
        MyString operator+ (const MyString& t) const;
        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 get_input (std::istream& in);
        size_t get_length () const;
        void from_c_str (const char *other);
 
        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, char *c);
        friend bool operator== (const MyString& t, const MyString& t1);
        friend bool operator!= (const MyString& t, char *c);
        friend bool operator!= (const MyString& t, const MyString& t1);
};
 
MyString::MyString ()
{
    length = 1;
    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)
{
    from_c_str (t.str);
 
    return *this;
}
 
MyString& MyString::operator= (const char *c)
{
    from_c_str (c);
 
    return *this;
}
 
MyString MyString::operator+ (const MyString& t) const
{
    return (MyString(str) += t.str);
}
 
bool operator== (const MyString& t, char *c)
{
    return (strcmp(t.str, c) == 0);
}
 
bool operator== (const MyString& t, const MyString& t1)
{
    return (strcmp(t.str, t1.str) == 0);
}
 
bool operator!= (const MyString& t, char *c)
{
    return !(operator== (t, c));
}
 
bool operator!= (const MyString& t, const MyString& t1)
{
    return !(operator== (t, t1.str));
}
 
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::exception ("wrong index");
    }
}
 
const char& MyString::at (size_t i) const
{
    if (str != NULL && i >= 0 && i < length)
    {
        return str[i];
    }
    else
    {
        throw std::exception ("wrong index");
    }
}
 
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::get_length () const
{
    return (length - 1);
}
 
void MyString::from_c_str (const char *c)
{
    length = strlen (c) + 1;
    str = new char[length];
    strcpy (str, c);
}
 
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
rangerx
1937 / 1546 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
16.01.2012, 18:36 #17
C++
1
2
3
4
5
MyString::MyString ()
{
    length = 1;
    str = '\0';
}
C++
1
2
3
4
5
6
MyString::MyString ()
{
    length = 0;
    str = new char[1];
    *str = '\0';
}
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
16.01.2012, 18:48 #18
C++
1
2
3
4
5
MyString::MyString ()
{
    length = 1;
    str = '\0';
}
подумайте, что на самом деле означает запись str = '\0'; думаю не то, что вы хотели

и для std::exception нет конструктора, принемающего const char* как аргумент

Добавлено через 4 минуты
добавьте ф-ю аля std::string::c_str
перепишите операторы используя только открытый интерфейс, и надобность в friendах отпадет
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
17.01.2012, 12:40 #19
YourLastSong, по-прежнему нету операторов отношения.
По-прежнему в функции get_input чудовищно расточительно используются ресурсы.
По-прежнему в операторе присваивания не проверяется присваивание объекта самому себе.

Добавлено через 1 минуту
И в from_c_str не очищается старая память - утечка памяти.
0
YourLastSong
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
19.01.2012, 21:59  [ТС] #20
и для std::exception нет конструктора, принемающего const char* как аргумент
А конструкция вида

throw std::out_of_range ("wrong index");
верна или нет всё же?

перепишите операторы используя только открытый интерфейс, и надобность в friendах отпадет
Какие именно?

Например, как переписать оператор == без доступа к приватным членам класса?

подумайте, что на самом деле означает запись str = '\0'; думаю не то, что вы хотели
Да, разумеется.

По-прежнему в функции get_input чудовищно расточительно используются ресурсы
А как это вообще реализовано, например, в STL?

Сможете написать свой вариант, если не сложно, разумеется?

Попробовал кое-что исправить:

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
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 char *c);
        MyString operator+ (const MyString& t) const;
        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;
        void from_c_str (const char *other);
        char* c_str ();
 
        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, char *c);
        friend bool operator== (const MyString& t, const MyString& t1);
        friend bool operator!= (const MyString& t, char *c);
        friend bool operator!= (const MyString& t, const MyString& t1);
};
 
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 MyString::operator+ (const MyString& t) const
{
    return (MyString(str) += t.str);
}
 
bool operator== (const MyString& t, char *c)
{
    return (strcmp(t.str, c) == 0);
}
 
bool operator== (const MyString& t, const MyString& t1)
{
    return (strcmp(t.str, t1.str) == 0);
}
 
bool operator!= (const MyString& t, char *c)
{
    return !(operator== (t, c));
}
 
bool operator!= (const MyString& t, const MyString& t1)
{
    return !(operator== (t, t1.str));
}
 
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);
}
 
char* MyString::c_str ()
{
    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
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
19.01.2012, 22:15 #21
Цитата Сообщение от YourLastSong Посмотреть сообщение
верна или нет всё же?
Верна. Но у std::exception все же нет по стандарту конструктора, принимающего const char *.

Цитата Сообщение от YourLastSong Посмотреть сообщение
как переписать оператор == без доступа к приватным членам класса
У вас есть открытый оператор индексации. Намёк ясен?

Цитата Сообщение от YourLastSong Посмотреть сообщение
А как это вообще реализовано, например, в STL?
Не знаю, лень искать в исходниках. Я вам предлагал уже такой вариант:
Цитата Сообщение от silent_1991 Посмотреть сообщение
Самое простое тут - на каждой итерации выделять строку размером в два раза (или на определённый квант) больше предыдущей итерации. По завершении ввода просто перевыделите строку окончательно длины и скопируете туда символы из предварительной строки большей длины.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2012, 22:16 #22
C++
1
2
3
// это лучше сделать в виде ф-ии френда. чтобы можно было добавить оператор +,
// у которого первым идет const char*. Еще советуют возвращать константный объект.
MyString operator+ (const MyString& t) const;
C++
1
2
3
4
5
6
// нет версий, где первый идет const char*
// передаваемый указатель на чар должен быть константным.
friend bool operator== (const MyString& t, char *c);
friend bool operator== (const MyString& t, const MyString& t1);
friend bool operator!= (const MyString& t, char *c);
friend bool operator!= (const MyString& t, const MyString& t1);

У стандартной строки есть ф-ия swap, которая не кидает исключений.

C++
1
2
// лучше возвращать ссылку на строку
void operator+= (const MyString& t);
C++
1
2
3
// в приватную часть класса. хотя если реализовать ф-ию своп, в этом ф-ии не будет нужды. копипаста тоже не будет.
// оператор = можно будет заимплементить созданием временного объекта с const char* и засвопить this  с временным объектом.
void from_c_str (const char *other);
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
19.01.2012, 22:22 #23
YourLastSong, у вас опять отсутствуют операторы отношения (т.е. операторы <, <=, >, >=).

Добавлено через 3 минуты
Цитата Сообщение от DU Посмотреть сообщение
это лучше сделать в виде ф-ии френда
Нет, это лучше сделать в виде глобальной функции-не друга. Потому как есть оператор +=, через который можно реализовать оператор +, не нарушая инкапсуляции.
Цитата Сообщение от DU Посмотреть сообщение
Еще советуют возвращать константный объект
Зачем? Ведь здесь попытка повторить std::string. А в нём оператор конкатенации возвращает неконстантный объект.
Цитата Сообщение от DU Посмотреть сообщение
// нет версий, где первый идет const char*
Она и не нужна, конструктор сыграет роль преобразователя.
Цитата Сообщение от DU Посмотреть сообщение
// лишнее. есть оператор =
Метод std::string::assign как-то лишним никто не называл.
Цитата Сообщение от DU Посмотреть сообщение
// лучше возвращать ссылку на строку
Лучше - это ещё мягко сказано...
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2012, 22:28 #24
Зачем? Ведь здесь попытка повторить std::string. А в нём оператор конкатенации возвращает неконстантный объект.
Сообщение от DU
// нет версий, где первый идет const char*
не уверен, будет преобразование или ошибка компиляции. но даже если и будет, это не очень эффективно. выделение памяти все таки в недрах конструктора. для классов общего пользования это играет не последнюю роль.

на счет оператора + - это да. с френдом я погорячился. имплементится за счет публичного operator +=

константный обхект в операторе + советуют возвращать чтобы не было попыток модифицировать временный объект. мейерс как-то там это аргументировал. я уже не помню деталей.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
19.01.2012, 22:29 #25
Цитата Сообщение от DU Посмотреть сообщение
будет преобразование или ошибка компиляции
Будет преобразование.

Цитата Сообщение от DU Посмотреть сообщение
это не очень эффективно
Согласен, зато лаконично)))
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2012, 22:38 #26
ну вот я проверил в студии. мои сомнения подтвердились. если оператор + - метод класса, то преобразования не будет, будет ошибка. если он - свободная ф-ия, то тут да. будет преобразование. но т.к. насоветовали его сделать именно свободной ф-ией, то остается только проблема эффективности
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
19.01.2012, 22:42 #27
DU, если метод класса - преобразование будет, но только для правого операнда. Ну это естественно, ведь вызов оператора как метода происходит как object.operator+(operand). Поэтому object обязан быть объектом класса. А вот операнд может неявно преобразоваться через конструктор.

Добавлено через 1 минуту
DU, http://liveworkspace.org/code/9ff20e7dacf8d2ddd9772df8e3b79d83
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2012, 22:44 #28
ну значит мы друг друга не поняли. я говорил о том, что в текущей реализации нет возможности писать так:
C++
1
"str" + MyString()
const char* в этом случае не будет преобразовываться в MyString , чтобы избавится от ошибки компиляции.
текудая реализация - это оператор + как метод класса а не ф-ия. со свободными ф-иями преобразования будут.
осталось чтобы остальные не запутались
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
19.01.2012, 22:49 #29
DU, потому я и предлагаю реализовывать все операторы без присваивания как внешние функции, посредством тех же операторов с присваиванием. Т.е. operator+ реализовать как внешнюю функцию, принимающую два операнда типа MyString, через operator+=, реализованный, разумеется, как метод. Это логично. Потому что у operator+= слева обязан стоять объект MyString, а справа может стоять как MyString (напрямую принимается оператором), так и const char * (преобразовывается в MyString конструктором). А operator+ реализовать не составит никакого труда на основе operator+=:
C++
1
2
3
4
MyString operator+(const MyString& left, const MyString& right)
{
    return MyString(left) += right;
}
0
YourLastSong
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
19.01.2012, 22:50  [ТС] #30
Она и не нужна, конструктор сыграет роль преобразователя.
Странно, без них программа вылетает при попытке выполнить след. код:

C++
1
2
3
4
5
if ("str" == str)
    std::cout << "aaaaa";
 
if ("s" != str)
    std::cout << "aaaaa";
0
19.01.2012, 22:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2012, 22:50
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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