Основы C++ | Перегрузка operator+ для m_string
Подскажите пожалуйста, почему функция не работает.
В привате str описан как указатель на char. В конструкторе инициирован так: str = new char [mas_size]
Код:
m_string m_string::operator+ (const m_string &sec)
{
int count_sec, count_str;
char *sum_str;
count_sec = stlen(sec);
while (str[count_str] != '\0') count_str++;
sum_str = new char[count_str + count_sec + 2];
for (int i = 0; i <= count_str; i++) sum_str[i] = str[i];
for (int i = 0; i <= count_sec; i++) sum_str[count_str + 2 + i] = sec.str[i];
sum_str[count_str + count_sec + 2] = '\0';
return *sum_str;
delete[] sum_str;
};
|
Код:
m_string m_string::operator+ (const m_string &sec)
{
int count_sec, count_str;
char *sum_str;
// WTF stlen(const m_string &)?
count_sec = stlen(sec);
// где инициализируется count_str? C++ не инициализирует стандартные классы.
while (str[count_str] != '\0') count_str++;
sum_str = new char[count_str + count_sec + 2];
for (int i = 0; i <= count_str; i++) sum_str[i] = str[i];
// что в строке? "string1" + 2 неизвестных буквы + "string2"?
for (int i = 0; i <= count_sec; i++) sum_str[count_str + 2 + i] = sec.str[i];
sum_str[count_str + count_sec + 2] = '\0';
return *sum_str;
// это никогда не запустится:
delete[] sum_str;
};
Вообще, советую использовать стандартные классы basic_string. Они очень хорошо написаны и эффективно работают. Ну если уж хочется поэкспериментировать, советую немного переписать:
Код:
class m_string
{
char* data;
public:
m_string(char* d=0) : data(d) {}
~m_string() { delete[] data; } // delete 0 не является ошибкой
int size() const { return data ? strlen(data) : 0; }
...
friend m_string operator+(const m_string &, const m_string &)
};
m_string operator+ (const m_string &a, const m_string &b)
{
char* tmp = new char[a.size() + b.size() + 1];
m_string result(tmp);
// теперь даже при исключении все освободится
if (a.data)
{
for(char* aa=a.data; *aa; ++aa)
{
*tmp++ = *aa;
}
}
if (b.data)
{
for(char* bb=b.data; *bb; ++bb)
{
*tmp++ = *bb;
}
}
*tmp = char();
return *result;
};
|
Время: 11:29.
© OSzone.net 2001-