Задание
Разработать собственный класс управления строками. Объекты которого использовать как элементы ранее разработанного контейнером (см. здесь). Расширить функциональность контейнерного класса, обеспечив обработку данных, хранящихся, например: поиск. Продемонстрировать возможность однотипной обработки разнотипных элементов контейнера (Объектов класса строки и каких-либо других).
Примечания: предусмотреть возможность ввода и вывода данных с использованием стандартных cin, cout.
Выбор алгоритма решения задачи
Для реализации данной задачи необходимо разработать собственный класс управления строками.Т.е. перегружать операторов += для присвоения к существующему строки, операция == для сравнения, операция < или > и т.д. Я использовал ранее разработанный абстрактный базовый класс. И объявил производный от него класс в котором описал действия управления строками.
Описание решения задачи
Для решения этой задачи необходимо объявить абстрактный базовый класс class Employee. В нем я перегружает основные перегружены функции - это, например <<: friend ostream & operator<< (ostream & про, Employee &). После этого объявляется производный от абстрактного - это class String.Записывается он так: class String: public Employee. Так же в этом классе реализован поиск в строке.
Схема алгоритма решения задачи
Текст программы
1. Base.h
#ifndef BASE_H
#include <iostream.h>
#include <string.h>
#include <assert.h>
#define BASE_H
class Employee {
public:
Employee (void) {};
friend ostream & operator<< (ostream & o, Employee &) ;
friend istream & operator>> (istream & o, Employee &) ;
};
#endif
2. Cint.h
#ifndef CINT_H
#define CINT_H
#include <iostream.h>
#include <string.h>
#include "base.h"
class String : public Employee {
private:
int length;
char *sPtr;
void setString (const char *);
public:
String (const char * = "");
String (const String &);
~String(void);
void Poisk ();
const String &operator= (const String &i)
{ if ( &i != this) {
delete [] sPtr;
length = i.length;
setString( i.sPtr );
}
return *this;
}
bool operator ==(const String &i) const
{return strcmp (sPtr, i.sPtr) == 0;}
const String &operator+= (const String &);
friend ostream &operator<< (ostream &o, const String &s)
{ o <<s.sPtr; return o;}
friend istream &operator>> (istream &i, String &s)
{ char temp[50];
i >> setw(50)>>temp;
s = temp;
return i;
}
bool operator!= ( const String &right ) const
{ return !( *this == right ); }
// проверка s1 > s2
bool operator<( const String &i ) const
{ return strcmp (sPtr, i.sPtr) < 0;}
bool operator> ( const String &i ) const
{ return strcmp (sPtr, i.sPtr) > 0;}
virtual bool operator<=( const String &right ) const
{ return !( right < *this ) ; }
bool operator>=( const String &right)
{ return !( *this < right ); }
};
const String &String::operator +=( const String &right)
{
char *tempPtr = sPtr;
length += right.length;
sPtr = new char [length +1];
assert ( sPtr != 0);
strcpy ( sPtr, tempPtr);
strcat ( sPtr, right.sPtr);
delete [] tempPtr;
return *this;
}
void String::setString(const char *st) {
sPtr = new char [length + 1 ];
assert( sPtr != 0);
strcpy( sPtr, st);
}
void String::Poisk ()
{
char st1[12];
cout << "Vvedite poisk: ";
cin >>st1;
if (strstr(sPtr, st1) != NULL)
cout <<"Takoe est' v stroke";
}
String::String(const char *s) : length ( strlen ( s ) )
{
cout<<"Conversion constructor: "<< s << '\n';
setString ( s );
}
String::String(const String ©) : length ( copy.length )
{
cout<<"Copy constructor: "<< copy.sPtr << '\n';
setString ( copy.sPtr );
}
String::~String()
{
delete [] sPtr;
}
#endif
3. Main.cpp
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
#include <string.h>
#include "BASE.h"
#include "Cint.h"
int main()
{
int i;
String A1,A2,A3;
String A4[4];
cout << "Vvedite - 2 raza 2 slova: \n";
cin >> A1;
cin >> A2;
cout <<"Vvedite masiv strok (4): ";
for (i = 0; i<4; i++){
cin>>A4[i];}
cout <<"Perviy masiv = " << A1<<'\n';
cout <<"Vtoroy masiv = " << A2<<'\n';
if (A1 == A2) cout << "A1 == A2 \n";
A3 = A1;
A1 = A2;
cout<<"Posle A1 = A2, A1 : "<< A1 << endl;
if (A1 > A3) cout << "A1 > A3 \n";
if (A1 != A3) cout << "A1 != A3 "<<endl;
cout<<"Posle A1 += A3 = ";
A1 += A3;
cout<<A1<<endl;
cout << "Masiv = ";
for (i = 0; i<4; i++){
cout<<A4[i]<<'\n';}
A1.Poisk();
cout<<endl;
getch();
return 0;
}
Результати работы программы