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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузить самого себя или Перегрузка операторов 
V
    Опции темы
initmax
Дата 8.1.2010, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть код, который реализует перегрузку операторов

Код


#include <stdio.h>
#include <iostream.h>
#include <string.h>

using namespace std;
class mString
{
private:
    char *_str;
public:
    const char* getStr(void)const ;
    void const setStr(const char *str);
    mString(const char *ch);
    mString(const mString &string);
    mString();
    ~mString();
    mString& operator=(const mString &str);
    mString& operator+=(const mString &str);
    mString& operator+=(const char *);
    mString& operator-=(const mString &str);

    char operator[] (size_t idx) const {return _str[idx];}
    char& operator[] (size_t idx) {return _str[idx];}



};

//Constructor get NULL parameters
mString::mString()
{
   _str =NULL;
}


mString::~mString()
{

    delete[] _str;
}



//Constructor get OBJ
mString::mString(const mString &string)
{
    int l=strlen(string.getStr());
    _str=new char[l+1];
    strcpy(_str,string.getStr());
}

//Constructor get String
mString::mString(const char *ch)
{
    int l=strlen(ch);
    _str=new char[l+1];
    strcpy(_str,ch);
}

//A new line-length jobs
const char* mString::getStr(void)const
{
    return _str;
}

void const mString::setStr(const char *str)
{
     int l=strlen(str);
     delete[] _str;
     _str =new char[l+1];
    strcpy(_str,str);
}


mString& mString::operator=(const mString &string)
{
    int l=strlen(string.getStr());
    delete[] _str;
    _str=new char[l+1];
    strcpy(_str,string.getStr());
    return *this;
}


ostream& operator << (ostream& os, const mString& str)
{
    os<<str.getStr()<<endl;
    return os;
}

//Перегружаемые функции +
//################################################################
static const mString operator+( mString &strL, mString &strR)
{
    mString t=strL;
    t+=strR;
    return t;
}


static const mString operator+(char *strL, mString &strR)
{
     int l=strlen(strL);
     mString t;
     t.setStr(strL);
    t+=strR;
    return t;
}

static const mString operator+( mString &strL, char *strR)
{

    mString tmp;
    tmp.setStr(strR);
    strL+=tmp;
    return strL;
}


//Перегружаемые функции -
//################################################################
static const mString operator - (const mString &strL, mString &strR)
{
    mString tmp1;
    mString tmp2;
    int L = strlen(strL.getStr());
    int R = strlen(strR.getStr());

     char* nv1=NULL;
    char* nv2=NULL;

     int i=0;

    for(i=L-1; i>=0; --i)
    {
      if(strL.getStr()[i] != ' ')
      {
          nv1=new char[i];
          strncpy(nv1,strL.getStr(),i+1);
          i=0;
      }
    }

     int k=0,j=0;
    for(j=0; j<R-1; ++j)
    {
      if(strR.getStr()[j] != ' ') {k = j; break;}
    }

    nv2=new char[(j-k)+1];
    for(j=0; j<R; ++j)
    {
       nv2[j]=strR.getStr()[j+k];
    }

    tmp1.setStr(nv1);
    tmp2.setStr(nv2);

//    cout<<"tmp1->>"<<tmp1.getStr();
//    cout<<"tmp2->>"<<tmp2.getStr();

    tmp1+=tmp2;
    return tmp1;
}

//Перегружаемые функции +=, -=
//################################################################
mString& mString::operator+=(const mString &string){
    int l=strlen(string.getStr())+strlen(_str);
    char* nv=new char[l+1];
    strcpy(nv,_str);
    delete[] _str;
    _str=strcat(nv,string.getStr());
    return *this;
}

/*
mString& mString::operator+=(const mString &string){
    int l=strlen(string.getStr())+strlen(_str);
    char* nv=new char[l+1];
    strcpy(nv,_str);
    delete[] _str;
    _str=strcat(nv,string.getStr());
    return *this;
}
*/



mString& mString::operator-=(const mString &string)
{
    int l=strlen(string.getStr())+strlen(_str);
    char* nv=new char[l+1];
    strcpy(nv,_str);
    delete[] _str;
    _str=strcat(nv,string.getStr());
    return *this;
}






int main(void)
{
    mString str1="Super Mega   ";
    mString str2="        Max";
    mString str_n;
    mString a = "first", b = "second", z;
    mString rt="asasa";


// rt = rt;

     cout<<"1= "<<str1;
     cout<<"2= "<<str2;


     z=a+b;
     cout<<"3= "<<z;

     z="hello"+a;
     cout<<"4= "<<z;

     z=a+"hello";
     cout<<"5= "<<z;

     z=str1-str2;
     cout<<"6= "<<z;

     z = a+=b;
     cout<<"7= "<<z;


     cout<<"8= "<< a[6] <<"\n";
     cout<<"9= "<< a[1] <<"\n";

     z=a=b;
     cout<<"10= "<<z;

     (z=a)=b;
     cout<<"11= "<<z;

     (z="hello")+=a;
     cout<<"12= "<<z;

     (z="mega hello")-=a;
     cout<<"14= "<<z;


     return 0;
}


Интересует каким обрзамо перегрузить "себя же"

т.е. строке  mString rt="asasa"; присвоить самого себя

rt=rt - как это записывается верно?

mString rt="asasa"; присвоить себе же, по идее ничего произойти не должно, интересно знать каким образом компилер оределенияет "перегрузку самого себя" т.е. что происходит из нутри
 
спасибо.

PM MAIL   Вверх
zim22
Дата 8.1.2010, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Цитата(initmax @  8.1.2010,  18:35 Найти цитируемый пост)
rt=rt - как это записывается верно?

так и записывается. и уже внутри operator= делаешь проверку на равенство объектов в самом начале функции.
Цитата(initmax @  8.1.2010,  18:35 Найти цитируемый пост)
т.е. строке  mString rt="asasa"; присвоить самого себя

это называется инициализация. у тебя есть конструктор преобразования
Код

mString(const char *ch);

благодаря ему и возможна такая форма записи. 

Это сообщение отредактировал(а) zim22 - 8.1.2010, 19:45


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


Бывалый
*


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

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



Цитата(zim22 @ 8.1.2010,  19:44)
Цитата(initmax @  8.1.2010,  18:35 Найти цитируемый пост)
rt=rt - как это записывается верно?

так и записывается. и уже внутри operator= делаешь проверку на равенство объектов в самом начале функции.
Цитата(initmax @  8.1.2010,  18:35 Найти цитируемый пост)
т.е. строке  mString rt="asasa"; присвоить самого себя

это называется инициализация. у тебя есть конструктор преобразования
Код

mString(const char *ch);

благодаря ему и возможна такая форма записи.

написал в майн так 

Код

rt.operator = (rt);
    cout<<"0 = "<<rt;


на выходе пустая строка, хотя ошибок нет...
PM MAIL   Вверх
EnergoHokum
Дата 8.1.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Цитата

mString rt="asasa"; присвоить себе же, по идее ничего произойти не должно, интересно знать каким образом компилер оределенияет "перегрузку самого себя" т.е. что происходит из нутри

Если я правильно понял вопрос, то происходить должно приблизительно следующее:

Код

mString& mString::operator = (const mString& imstring)
{
  if(&imstring != this)
  { // если адрес входной mString не равен this-у, то на вход дан другой объект
     // тут удаление буфера и пересоздание с присваиванием
  }
  return *this;
}


Вроде бы так...
PM MAIL ICQ   Вверх
initmax
Дата 8.1.2010, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Примногоблагодарен! разобрался.
PM MAIL   Вверх
bsa
Дата 10.1.2010, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 85
Всего: 196




M
bsa
initmax, если ответ на вопрос получен, то пометь тему решенной

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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