Deem |
Отправлено: 10.10.2005, 10:47 |
|
Мастер участка
Группа: Участник
Сообщений: 327
|
Вот, начал писать себе класс для работы со строками (там, где это надо, нет ничего подобного ).
Заголовочный:
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 с результатом сложения должен быть, т.к. выражение может быть побольше, чем на один плюс. И объекты, участвующие в операции, не могут изменяться сами.
Может все правильно и я зря волнуюсь?
|
|
Георгий |
Отправлено: 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
|
Спасибо огромное. Книга старенькая, не самая лучшая, но уже родная.
А память таки сливалась и у меня. Но теперь все работает. Класс!
|
|
|