Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Реализация класса: текст.

Читайте также:
  1. IV. Реализация национальной морской политики
  2. V. Прочитайте и переведите текст.
  3. Воплощение и реализация
  4. Выбор и реализация решения
  5. Переведите с листа на русский язык следующий текст.
  6. Переведите текст.
  7. Пример 10.2. Реализация принципа наследования классов

#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 страница

mybiblioteka.su - 2015-2024 год. (0.026 сек.)