C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Оператор "+" для своего класса
Deem
Отправлено: 10.10.2005, 10:47


Мастер участка

Группа: Участник
Сообщений: 327



Вот, начал писать себе класс для работы со строками (там, где это надо, нет ничего подобного smile.gif ).
Заголовочный:
CODE


#ifndef String_H
#define String_H

class TString
{
 char *Data;
 int Len;
 friend TString &operator + (TString &StringObj,char* Str);
 friend TString &operator + (TString &StringObjL,TString &StringObjR);
 friend TString &operator + (char* Str, TString &StringObj);
 public:
   TString(void);
   TString(char* Str);
   ~TString(void);
   TString &operator = (char* Str);
   TString &operator += (char* Str);
   
   TString &operator = (TString &StringObj);
   TString &operator += (TString &StringObj);
   
   
   char* c_str(void);
   int Length(void);
};

#endif



Реализация:
CODE

#include "TString.h"

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

TString::TString(void)
{
 Data = new char;
 *Data = 0;
 Len = 0;

}
TString::TString(char* Str)
{
 Data = new char [(Len = strlen(Str))+1];
 strcpy(Data,Str);

}
TString::~TString(void)
{
 printf("destructor\n");
 delete Data;
}
TString &TString::operator = (char* Str)
{
 delete Data;
 Data = new char [(Len = strlen(Str))+1];
 strcpy(Data,Str);
 return *this;
}
TString &TString::operator = (TString &StringObj)
{
 delete Data;
 Data = new char [(Len = StringObj.Length())+1];
 strcpy(Data,StringObj.c_str());
 return *this;
}
TString &TString::operator += (char* Str)
{
 char* OldData = Data;
 
 Data = new char [(Len += strlen(Str))+1];
 strcpy(Data,OldData);
 strcat(Data,Str);
 delete OldData;
 return *this;
}


TString &TString::operator += (TString &StringObj)
{
 char* OldData = Data;
 Data = new char [(Len += StringObj.Length())+1];
 strcpy(Data,OldData);
 strcat(Data,StringObj.c_str());
 delete OldData;
 return *this;
 

}
TString &operator + (TString &StringObj,char* Str)
{
 
 TString* Res = new TString();
 Res->Len = StringObj.Length()+strlen(Str);
 Res->Data  = new char [(Res->Len+1)];
 strcpy(Res->Data, StringObj.Data);
 strcat(Res->Data, Str);
   
 return *Res;

}

TString &operator + (char* Str, TString &StringObj)
{
 
 TString* Res = new TString();
 Res->Len = StringObj.Length()+strlen(Str);
 Res->Data  = new char [(Res->Len+1)];
 strcpy(Res->Data, Str);
 strcat(Res->Data, StringObj.Data);
 
   
 return *Res;
 
}
TString &operator + (TString &StringObjL,TString &StringObjR)
{
 
 TString* Res = new TString();
 Res->Len = StringObjL.Length()+StringObjR.Length();
 Res->Data  = new char [(Res->Len+1)];
 strcpy(Res->Data, StringObjL.Data);
 strcat(Res->Data, StringObjR.Data);
   
 return *Res;

}
char* TString::c_str(void)
{
 return Data;
}
int TString::Length(void)
{
 return Len;
}


Смущает вот метод
TString &operator + (TString &StringObj,char* Str)
и другие подобные. Подобную реализацию оператора + нашел в книге. Что скажете о динамическом создании временного объекта ?
Отслеживал деструкторы. Временные объекты, понятное дело, никто не удаляет. Но и на утечку памяти ни VC ни Борланд не жалуются.
А может есть другие аврианты? Временный класc с результатом сложения должен быть, т.к. выражение может быть побольше, чем на один плюс. И объекты, участвующие в операции, не могут изменяться сами.
Может все правильно и я зря волнуюсь? smile.gif
Георгий
Отправлено: 11.10.2005, 01:15


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



честно говоря, есть штатный способ — в стеке создавать и возвращать не ссылку, а копию, причём не простую, а константную.
т.е. заменить TString * res = new TString; на TString res;
и TString& operator +(TString&,TString&) на const TString operator +(const TString&,const TString&);


кстати, не знаю как у вас, а у нас всё течёт рекой. попробуй написать:
CODE
for(;;){
TString a,b,c;
b="asd";
c="qwe";
a=b+c;
};
и посмотри в менеджере процессов, как увеличивается объём занятой памяти. у меня получалось около 3-4 мб в секунду

PS. и операторы не правильно объявленны — надо в них константные ссылки передавать, а то стандартный кастинг работать не будет.
PPS. книжку накую то плохую ты взял :-)

Отредактировано Георгий — 11/10/2005, 02:25
Deem
Отправлено: 11.10.2005, 11:49


Мастер участка

Группа: Участник
Сообщений: 327



Спасибо огромное. Книга старенькая, не самая лучшая, но уже родная. smile.gif

А память таки сливалась и у меня. Но теперь все работает. Класс!

Вернуться в Вопросы программирования в C++Builder