Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator + for strings 
:(
    Опции темы
sol78
Дата 15.1.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: 1
Всего: 0



Вот пытаюсь переписать оператор + для стрингов ...
почему не работает, понять не могу:
.h
Код

#ifndef _MY_STRING
#define _MY_STRING
#include <string>
#include <iostream>
using std::cout;

class my_string
{
    char* c_str;
    size_t length;
    size_t* count_ptr;
    public:
        my_string(const char* str=0); //Constructor
        my_string(my_string&);        //CopyConstructor
        void display()const;
        int replace(char , char);
        ~my_string();                 //Destructor

//operators overloading
        my_string operator+(const my_string& str)const
        {
            my_string r_str(c_str);
            strcat(r_str.c_str, str.c_str);
            r_str.length=strlen(r_str.c_str);
            return r_str; 
        }
    


};

#endif

.cpp
Код

#include "My_string.h"

my_string::my_string(const char* str):c_str(0), length(0), count_ptr(0)
{
    if(str)
    {
        length=strlen(str)+1;
        count_ptr=new size_t(0);        
        c_str=new char[length];
        strcpy(c_str, str);
    }
    cout << "Constructor" <<'\n';
}


my_string::my_string(my_string& str): length(str.length), c_str(0), count_ptr(0)
{
    count_ptr=str.count_ptr;
    (*count_ptr)++;
    c_str=str.c_str;
    

    cout << *count_ptr ;
    cout << "CopyConstructor" <<'\n';
}


void my_string::display()const
{ 
    cout << "------------------" << '\n';
    cout << c_str << '\n';
    cout << *count_ptr << '\n';
    cout << "------------------" << '\n';
}


int my_string::replace(char old_ch , char new_ch)
{
    int index=0;
    int count_ch=0;

    char* tmp_str=c_str;
    size_t* tmp_count=count_ptr;

    (*tmp_count)--;
    count_ptr=new size_t(0);
     
    c_str=new char[length];
    
    if(c_str)
    {
        strcpy(c_str, tmp_str);
        while(c_str[index] != '\0')
        {
            if(c_str[index]==old_ch)
            {
               c_str[index]=new_ch;
               count_ch++;
            }
            index++;
        }
    }
    return count_ch;
}


my_string::~my_string()
{
    if(*count_ptr==0)
    {
        cout << "delete" << '\n';
        delete [] c_str;
        delete count_ptr;
        
    }
    else  (*count_ptr)--;
    cout << "Destructor" << '\n';
}
    

Гляньте, плиз, зарание спасибо...
PM MAIL   Вверх
Fazil6
Дата 15.1.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(sol78 @  15.1.2008,  14:56 Найти цитируемый пост)
Вот пытаюсь переписать оператор + для стрингов ...почему не работает, понять не могу:

в чем смысл написания такого класса?

Код

my_string operator+(const my_string& str)const
        {
            my_string r_str(c_str);
            strcat(r_str.c_str, str.c_str);   // думаю, что в этом месте все неправильно
            r_str.length=strlen(r_str.c_str);
            return r_str; 
        }

PM MAIL   Вверх
sol78
Дата 15.1.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: 1
Всего: 0



Цитата(Fazil6 @  15.1.2008,  16:05 Найти цитируемый пост)
strcat(r_str.c_str, str.c_str);   // думаю, что в этом месте все неправильно

что именно?

strcat - обьединяет строку str.c_str со сторокой r_str.c_str
PM MAIL   Вверх
Fazil6
Дата 15.1.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(sol78 @  15.1.2008,  15:20 Найти цитируемый пост)
strcat - обьединяет строку str.c_str со сторокой r_str.c_str

а, место под это объединение ?
PM MAIL   Вверх
Lazin
Дата 15.1.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



я так понял ты пытаешься реализовать принцип copy on write, опнратор сложения то-же должен работать с count_ptr, ну и 
Цитата(Fazil6 @  15.1.2008,  16:05 Найти цитируемый пост)
strcat(r_str.c_str, str.c_str);   // думаю, что в этом месте все неправильно

PM MAIL Skype GTalk   Вверх
sol78
Дата 15.1.2008, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: 1
Всего: 0



вот так заработало:
Код

my_string operator+(const my_string& str)const
{
         return concatenate(str);
}

...


my_string my_string::concatenate(const my_string& str)const
{
    my_string result; //вызов конструктора?
    int len=strlen(str.c_str)+strlen(c_str);
    char* tmp_buf=new char[len+1];
    strcpy(tmp_buf,c_str);
    strcat(tmp_buf,str.c_str);

    result.c_str=tmp_buf;
    result.count_ptr=new size_t(0);  / /почему надо ето делать, ведь ето делаеться в конструкторе?
    result.length=len; 

    return result;
}


может есть еще варианты?
PM MAIL   Вверх
sol78
Дата 15.1.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: 1
Всего: 0



вот так же, если кому интересно +=
Код

        my_string& operator+=(const my_string& str)
        {
            size_t len=strlen(c_str)+strlen(str.c_str);
            char* tmp=new char[len+1];
            strcpy(tmp, c_str);
            strcat(tmp, str.c_str);

            (*count_ptr)--;
            count_ptr=new size_t(0);
            c_str=tmp;

            return *this;
        }



Это сообщение отредактировал(а) sol78 - 15.1.2008, 23:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.