Перетворення рядків в об’єкти класу String і навпаки 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Перетворення рядків в об’єкти класу String і навпаки



Розглянемо інший приклад, в якому використані конструктор з одним аргументом і оператор перетворення. тут використовується клас String, з яким вже раніше працювали у програмі 10.8.

Далі приведено лістінг програми 10.10.

#include <iostream.h>

#include <conio.h>

#include <bios.h>

#include <string.h>

#include <stdlib.h>

class String //Клас для рядків

{private:

enum {SZ=80}; // max для рядків

char str[SZ]; //масив для рядків

public:

String () //конструктор без параметра

{str[0]=’\x0’;}

 

String(char s[])

{strcpy(str,s);}

 

void display() const

{cout <<str;}

void getstr()

{cin.get(str,SZ);}

 

//operator

operator char*();

};

String::operator char*()

{return str;}

//////////////////

int main()

{clrscr();

String s1;

char xstr[]=”Звичайний рядок “;

s1=xstr; //неявний конструктор з 1 параметром

s1.display();

String s2=”Інший рядок”; //конструктор з параметром;

cout<<endl<<(char*)s2;

cout<<endl;

bioskey(0);

return 0;

}

Програма 10.14

 

Конструктор з одним аргументом перетворює звичайний рядок (масив елементів типу char) в об’єкт класу String:

String(char s[])

{strcpy(str,s);}

Рядок передається в якості аргументу і коміюється у змінну str новоствореного об’єкту класу String, використовуючи бібліотечну функцію strcpy(). Це перетворення буде використовуватися, коли створюється об’єкт класу String:

String s2=”Інший рядок”;

або буде використовуватися у виразі присвоювання

s1=xstr;

де s1 - об’єкт класу String, а змінна xstr – просто рядок.

Операція перетворення використовується для перетворення об’єкту класу String у рядок:

String::operator char*()

{return str;}

Зірочка в цьому виразі означає вказівник на. Це інший спосіб оголошення змінної рядкового типу.

Оператор перетворення використовується компілятором у рядку

cout<<endl<<(char*)s2;

Тут s2 – змінна, що використовується як аргумент для перезавантаженої операції <<. Оскільки операції << нічого не відомо про визначений користувачем тип String, то компілятор намагатиметься перетворити змінну s2 на один з відомих йому типів. Ми визначимо тип, до якого хочемо перетворити змінну, за допомогою оператора (char*)s2 Оператор шукає перетворення від типу String до рядкового типу, і, знайшовши нашу функцію char*(), виконує її для генерації рядка, який потім буде виведений через операцію <<. Метод display стає зайвим і може бути видаленим.

Програма 10.14 демонструє, що перетворення типів відбувається автоматично не лише у виразах присвоювання, але і в інших підходящих місцях, таких як пересилання аргументів операціям (наприклад, <<) чи функціям. При передачі в операцію чи функцію аргументу неправильного типу, вони перетворюють його до прийнятного типу, якщо ми визначили таке перетворення.

Зауважимо, що ми не можемо використовувати явний вираз присвоювання для перетворення об’єкту класу String до змінної рядкового типу.

xstr=s2;

оскільки xstr є масивом. Щоб щось йому присвоїти, нам потрібно перезавантажити операцію присвоєння.

 

Перетворення об’єктів класів в об’єктів інших класів

Для перетворення між об’єктами різних визначених користувачем класів використовуються ті ж два методи перетворень, що й для перетворень між основними типами і об’єктами користувача. Тобто ми можемо використати конструктор з одним аргументом або операцію перетворення. Вибір залежить від того, чи хочемо ми записати функцію перетворення в класі для вихідного об’єкту чи для об’єкту призначення.

В подальших прикладах ми будемо працювати з двома класами, які відповідають різним способам вимірювання часу: 12-годинним і 24-годинним. Клас time12 буде використовувати години і хвилини, а також відмітки «до обіду» і «після обіду». Клас time24 відображатиме години, хвилини і секунди.

 

Функція у вихідному об’єкті

В програмі 10.15 ми розглянемо випадок, коли функція перетворення розміщена у вихідному класі. В цьому випадку вона буде реалізована у вигляді операції перетворення.

#include <iostream.h>

#include <conio.h>

#include <bios.h>

#include <string.h>

class time12

{private:

int pm;

int hrs;

int mins;

public:

time12():pm(1),hrs(0),mins(0)

{ }

time12(int ap,int h,int m):pm(ap),hrs(h),mins(m)

{ }

 

void display() const

{cout<<hrs<<":";

if (mins<10)

cout<<'0';

cout<<mins<<"-";

if(pm)

cout<<"p.m";

else

cout<<"a.m";

}

};

 

class time24

{private:

int hours;

int minutes;

int seconds;

public:

time24(): hours(0),minutes(0),seconds(0)

{}

time24(int h,int m,int s):hours(h),minutes(m),seconds(s)

{}

void display()const

{if(hours<10) cout<<"0";

cout<<hours<<":";

if(minutes<10) cout<<"0";

cout<<minutes<<":";

if (seconds<10) cout<<"0";

cout <<seconds;

}

operator time12()const;

};

time24::operator time12() const

{int hrs24=hours;

int pm=hours<12?0:1;

int roundmins=seconds<30?minutes:minutes+1;

if (roundmins==60)

{roundmins=0;

++hrs24;

if (hrs24==12||hrs24==24)

pm=(pm==1)?0:1;

}

int hrs12=(hrs24<13)?hrs24:hrs24-12;

if (hrs12==0)

{hrs12=12;

pm=1;

}

return time12(pm,hrs12,roundmins);

};

////////

int main()

{clrscr();

int h,m,s;

while(1)

//набрати 24 для виходу

{cout <<"Введіть час у 24-форматі:\n";

cout <<"Години (0-23):";cin>>h;

if (h>23)

return(1);

cout <<"Хвилини";cin>>m;

cout<<"Секунди:";cin>>s;

time24 t24(h,m,s);

cout<<"Вихідний час";

t24.display();

time12 t12=t24;

cout <<"\nV 12-год формат: ";

t12.display();

cout<<"\n\n";

};

return 0;

}

Програма 10.15

У функції main() ми визначили об’єкт класу time24, названий t24, і присвоїли йому значення годин, хвилин і секунд, одержані від користувача. Ми також визначили об’єкт класу time12, названий t12, та ініціалізували його значенням об’єкту t24 в рядку

time12 t12=t24;

Оскільки це об’єкти різних класів, то для здійснення присвоювання необхідне перетворювання. Ми визначили операцію перетворення в класі time24. Її оголошення

time24::operator time12() const

Ця функція перетворює об’єкт, що її викликає, в об’єкт класу time12 і повертає функції main() об’єкт, що потім буде присвоєний змінній t12.


 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 45; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.237.255 (0.012 с.)