Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Технологии разработки ПО 2005.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
833.54 Кб
Скачать

Преобразования объектов в основные типы и наоборот

Если необходимо осуществить преобразование определённых программистом типов в основные типы, то нельзя положиться на встроенные функции преобразования. В этом случае программисту необходимо самому написать функции для преобразования типов.

Рассмотрим пример перевода английской меры длины в метры и обратно, в котором показано, как происходит преобразование основного типа в тип, определённый программистом, и наоборот.

const float Kmf = 3.280833; // коэффициент

class Dist {

private:

int feet;

float inch;

public:

Dist() { feet = 0; inch = 0.0; }

Dist(int f, float i) { feet = f; inch = i; }

Dist(float m) { //конструктор перевода из метров в футы

float ff = Kmf*m;

feet = int(ff);

inch = 12*(ff-feet);

}

void show() {

cout << feet << "'-" << inch;

}

operator float() { //метод для перевода АТД к стандартному float

float fut = inch/12;

fut = fut + float(feet);

return fut/Kmf;

}

};

//---------------------------------------------------------------------------

int main() {

Dist d1;

float metr = 2.35, metr2=0.0;

d1 = Dist(metr); //переводим float в Dist

cout << "\nd1 = "; d1.show(); //увидим d1=7'-8.51949

metr2 = float(d1); //переводим Dist во float (можно написать просто metr2 = d1; )

cout << "\nmetr2 = " << metr2; //увидим metr2=2.35

getch(); return 0;

}

Для перехода от основного типа float к определённому программистом типу Dist мы используем конструктор с одним аргументом Dist(float m)…. Такого рода конструкторы иногда называют конструкторами преобразования. Этот конструктор вызывается, когда создаётся объект класса Dist с одним аргументом. Для перехода от определённого программистом типа Dist к основному типу float (в данной программе) используется метод преобразования. Этот метод принимает значение объекта класса Dist, преобразовывает его в значение типа float, представляющее собой метры, и возвращает это значение.

Преобразование объектов классов в объекты других классов

При преобразовании объектов одного класса в объекты другого класса применяются те же два способа преобразования, что и для преобразований между основными типами и объектами определённых пользователем классов, т.е. используется конструктор с одним аргументом или операция преобразования. Выбор зависит от того, хотите ли вы записать функцию преобразования в классе для исходного объекта или для объекта назначения. Если процедура преобразования записана в классе назначения, то используется конструктор, если процедура в исходном классе, то применяется операция преобразования. Класс назначения - это класс, объект которого получает значение. Например, записано object_a=object_b; , где object_a – объект класса А (это класс назначения), а object_b – объект класса В.

Рассмотрим программу, в которой производятся преобразования между двумя способами исчисления времени: 12-часовым и 24-часовым. На этом примере рассмотрим случай, когда функция преобразования расположена в исходном классе, следовательно исходя из упомянутого выше правила реализуем преобразование объекта одного класса в объект другого класса в виде операции (метода) преобразования.

class Time12 {

private:

bool pm; int hrs; int mins;

public:

Time12( ) : pm(true), hrs(0), mins(0)

{ }

Time12(bool ap, int h, int m) : pm(ap), hrs(h), mins(m)

{ }

void display( ) const {

cout << hrs << ':';

if (mins < 10) cout << '0';

cout << mins << ' ';

string am_pm = pm ? "p.m." : "a.m.";

cout << am_pm;

}

};

//---------------------------------------------------------------------------

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;

bool pm = hours < 12 ? false : true;

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

if (roundMins == 60) {

roundMins = 0;

++hrs24;

if (hrs24 == 12 || hrs24 == 24) pm = (pm == true) ? false : true;

}

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

if (hrs12 == 0) {

hrs12 = 12;

pm = false;

}

return Time12(pm, hrs12, roundMins);

}

//---------------------------------------------------------------------------

int main( ) {

int h, m, s;

while (true) {

cout << "Vvedite vremja v 24 formate: \n";

cout << " Chasy (от 0 до 23): "; cin >> h;

if (h > 23) return (1);

cout << " Min: "; cin >> m;

cout << " Sek: "; cin >> s;

Time24 t24(h, m, s); // присвоили объекту значения, введенные с клав.

cout << "Ishodnoe vremja: "; t24.display( );

Time12 t12 = t24; // преобразование

cout << "\nV 12-chas formate: "; t12.display( );

cout << "\n\n";

}

return 0;

}

//----------------------------------------------------

Функция Time24::operator Time12( ) const преобразует вызывающий её объект t24 в объект класса Time12 и возвращает его в главную функцию.

Если функция преобразования находится в классе назначения, то необходимо использовать конструктор с одним аргументом. В этом случае мы должны были в классе Time12 написать конструктор с 1 аргументом Time12(Time24) и метод Time12::Time12(Time24 t24).

Лекция 7 (15 стр.)