Ззадание
Используя раннее разработанный контейнер, расширить его функциональность за счет разработки дружественных классов для реализации доступа к его личным данным.
Методами дружного класса обеспечить поиск.
Выбор алгоритма решения задачи
Чтобы расширить функциональность ранее разработанного контейнера (см. здесь), включим в него дружеские функции.
Описание решения задачи
Для этого мы запишем в производном классе class String дружный класс, который мы назовем Drug. Объявления его записывается внутри класса String. И записывается он вот так: friend class Drug;
Текст программы
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 ();
friend class Drug;
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;
}
class Drug {
public:
String drug(String &);
char * p(String &);
void Poisk();
};
String Drug::drug(String &t)
{return t;}
char * Drug::p(String &t)
{ char *temp;
temp = t.sPtr;
return temp;}
void Drug::Poisk ()
{
char st2[12];
char st1[50];
Drug x;
cout << "Vvedite poisk: ";
cin >>st2;
strcpy(st1, x.p);
if (strstr(st1, st2) != NULL)
cout <<"Takoe est' v stroke";
}
#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];
Drug tt;
cout << "Vvedite - 2 raza 2 slova: \n";
cin >> A1;
cin >> A2;
cout <<"Experiment = "<<tt.drug(A1)<<" "<<tt.p(A1)<<'\n';
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<<"\nPoisk mojet delat' i friend class!!! \n"<<tt.p(A1);
// tt.poisk();
cout<<endl;
getch();
return 0;
}
Результат работы программы