Читайте также: |
|
#ifndef STRING_CLASS
#define STRING_CLASS
#include <iostream>
#include <string>
#include <stdlib>
#include <conio>
#include <assert>
#ifndef NULL
const int NULL=0;
#endif
в данном классе некоторые функции реализованы внутри тела класса, остальные - обычным способом
class string
{
private:
char *str; //указатель на динамически создаваемую
//строку
int size; //длина строки включает нуль-символ
public:
/*---------конструкторы и деструкторы----------*/
//конструкторы
string(char * s="");
string(const string& s); //конструктор копирования
~string(); //деструктор
/*-----------------операции присваивания----------------------*/
string& operator=(const string& s); //string=string
string& operator=(char *s); //string=c++string
/*--------------------------------------------------------------------*/
/*------------------операции сравнения------------------------*/
int operator==(const string& s) const
//string==string
{
return strcmp(str,s.str)==0;
}
int operator==(char *s) const
//string==c++string
{
return strcmp(str,s)==0;
}
friend int operator!=(char *str,const string& s)
//c++string==string
{
return strcmp(str,s.str)!=0;
}
int operator<(const string& s) const //string<string
{
return strcmp(str,s.str)<0;
}
int operator<(char *s) const //string<c++string
{
return strcmp(str,s)<0;
}
friend int operator<(char *str, const string& s)
//c++string<string
{
return strcmp(str,s.str)<0;
}
int operator>(const string& s) const //string>string
{
return strcmp(str,s.str)>0;
}
int operator>(char *s) const //string>c++string
{
return strcmp(str, s)>0;
}
friend int operator>(char *str, const string& s)
{
return strcmp(str,s.str)>0;
}
int operator<=(const string& s) const //string<=string
{
return strcmp(str,s.str)<=0;
}
int operator<=(char *s) const
//string<=c++string
{
return strcmp(str,s)<=0;
}
friend int operator<=(char *str, const string& s)
//c++string<=string
{
return strcmp(str,s.str)<=0;
}
int operator>=(const string& s) const //string>=string
{
return strcmp(str, s.str)>=0;
}
int operator>=(char *s) const
//string>=c++string
{
return strcmp(str, s)>=0;
}
friend int operator>=(char *str,const string& s)
//c++string>=string
{
return strcmp(str,s.str)>=0;
}
/*--------------------------------------------------------------------*/
/*----------операторы конкатенации и сцепления----------*/
string& operator+(string& s) //string+string
{
char *stroka; //указатель на новую строку
int len; //длина новой строки
delete[] stroka; //освобождаем память
len=size+s.size-1; //вычисляем длину новой
// строки
stroka=new char[len]; //выделяем нужную пвмять
if (s.str==NULL) //пароверка
{exit(1); }
s.size=len;
strcpy(stroka,s.str); //левая часть нового объекта
strcat(str,s.str); //правая часть нового объекта
return *this;
}
string& operator+(char *s) const //string+c++string
{
}
friend string operator+(char *str, const string& s)
// c++string+string
{
strcpy(str,s);
}
//сцепление(конкатенация) правого операнда
//с данным объектом и сохранение сцепленной
// строки в данном объекте
string operator+=(const string& s)
{
char *st=str; //сохранение до возможности
//удаления
size+=s.size; //новая длина объекта
str=new char[size+1]; //выделение памяти
if (str==NULL) //завершение если памяти не
//выделена
{exit(1);}
strcpy(str,st); //левая часть нового объекта
strcat(str,s.str); //правая часть нового объекта
delete[] st; //освобождение прежней области
// памяти
return *this; //обеспечивает возможность
//сцепленных вызовов
}
void operator+=(char *s); //string+=c++string
/*--------------------------------------------------------------------*/
/*----------------------string-функции----------------------------*/
//начиная с первого индекса найти положение
//символа с
int Find(char c,int start) const;
//найти последнее вхождение символа с
int FindLast(char c) const
{
int ret; //возвращаемое значение
char *p;
p=strrchr(str,c); //поиск символа с в строке str
//используется стандартная функция
//библиотеки string.h
if (p!=NULL) //проверка
ret=int(p-str);
else
ret=-1; //символ не найден
return ret; //возврат индекса положения
}
//вставить объект string в объект string
void Insert(const string& s, int index);
//вставить строку c++string в string
void Insert(char *s, int index);
//подстрока
string Substr(int index, int count) const
{
assert(index>=0 && index<size && count>=0);
string str;
if ((count==0)||(index+count>size))
str.size=size-index+1;
else
str.size=count+1;
delete [] str.str;
str.str=new char[str.size];
assert(str.str!=NULL);
strncpy(str.str, &str[index],str.size);
return str.str;
}
//удалить подстроку
void Remove(int index, int count);
//string индексация
char& operator[](int i)
{
assert(i>=0 && i<=size);
return str[i];
}
//преобразовать string в c++string
operator char*() const;
//вывод-ввод
friend ostream& operator<<(ostream& ostr, const string& s);
friend istream& operator>>(istream& istr, string& s);
//читать символы до разделителя
int readString (istream& istr=cin, char delimiter='\n')
{
char temp[256]; //читать строку в tmp
if (istr.getline(temp,256,delimiter)) //если не конец файла
//читать строку до 255 символов
{
delete[]str; //удалить текущую строку и
size=strlen(temp)+1; //создать массив для
//новой
str=new char[size];
if (str==NULL)
exit(1);
strcpy(str,temp); //копирование tmp
return size-1; //возвратить число
//считанных символов
}
else return -1;
}
//длина строки
int Length() const
{
char *stro;
return strlen(stro); //возвратить длину строки
}
/*--------------------------------------------------------------------*/
};
/*---------------------реализация функций-----------------------*/
string::string(char *s) //конструктор
{
size=strlen(s)+1; //вычисляется длина строки
str=new char[size]; //динамически выделяется
//память
if (str==0)
exit(1);
strcpy(str,s); //создается объект
}
string::string(const string& s) //конструктор
// копирования
{
size=strlen(s.str)+1; //те же самые операции
str=new char[size];
if (str==NULL)
exit(1);
strcpy(str,s.str);
}
string::~string() //деструктор
{
delete[] str;
}
string& string::operator=(char *s) //оператор
// присваивания
// string=c++string
{
int len; //длина новой строки
len=strlen(s)+1;
if (len!=size)
{delete[] str; //освобождение памяти
str=new char[len]; //выделение памяти для
//новой строки
if (str==0)
exit(1);
size=len;
}
strcpy(str,s); //копирование данной строки в
// новою
return *this;
}
string& string::operator=(const string& s) //оператор
// присваивания
//string=string
{
if (s.size!=size)
{delete[] str;
str=new char[s.size];
if (str==0)
exit(1);
size=s.size;
}
strcpy(str,s.str);
return *this;
}
istream &operator>>(istream &istr, string& s) //оператор
//ввода
{
char temp[255]; //для новой строки
istr>>temp; //поток ввода
if (strlen(temp)>=s.size)
{
delete[] s.str;
s.size=strlen(temp)+1;
s.str=new char[s.size];
if (s.str==NULL)
exit(1);
}
strcpy(s.str, temp);
return istr;
}
ostream &operator<<(ostream &ostr, const string& s)
{
ostr<<s.str; //поток вывода
return ostr; //возвращение, т.е. вывод на консоль
}
/*--------------------------------------------------------------------*/
/*-----------программа демонстрация класса---------------*/
#pragma hdrstop
#define TF(B) ((B)? "TRUE":"FALSE")
void main()
{
string s1("string"), s2("class"), s3("");
int i;
char c, cstr[30];
s3=s1+s2;
cout<<s1<<" объединена с "<<s2<<" = "<<s3<<endl;
cout<<"длина "<<s2<<" = "<<s2.Length()<<endl;
cout<<" последнее вхождение символа 's' в "<<s2<<" = "<<s2.FindLast('s')<<endl;
s1="FILE1.S";
cout<<" "<<s1<<"\n";
cout<<" тестирование операций отношений ";
s1="abcdef";
s2="bcf";
cout<< "s1<s2 "<<TF(s1<s2)<<endl;
cout<<"s1==s2 "<<TF(s1==s2)<<endl;
cout<<s1<<endl;
getch();
}
#endif
Дата добавления: 2015-10-29; просмотров: 80 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Реализация класса | | | Глава первая 1 страница |