Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Основы C++ | Перегрузка operator+ для m_string (http://forum.oszone.net/showthread.php?t=52534)

Skrip 09-08-2005 17:07 346949

Основы 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;
        };


pva 10-08-2005 13:41 347181

Код:

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.

Время: 11:29.
© OSzone.net 2001-