Приложение 3. Классы. Перегрузка конструкторов и функций класса. Дружественные функции
// Пример создания класса для хранения в одном и том же участке памяти разнотипных данных
// Класс использует перегрузку конструкторов и функций членов,
// а также дружественную функцию
#include "stdafx.h"
#include <iostream>
using namespace std;
const int SLen = 11;
const char Err[] = "\n*** Нет значения ***\n";
class t_Variant
{
char TypeVal; // Тип значения (0 - нет значения; 1 - целое; 2 - вещественное; 3 - строка )
union { // Анонимное объединение для хранения значений разных типов
int IVal;
double DVal;
char SVal [SLen];
};
public:
// Перегруженные конструкторы
t_Variant() { TypeVal = 0; }; // Нет значения
t_Variant(int V) { Set(V); }; // Инициализация целым
t_Variant(double V) { Set(V); }; // Инициализация вещественным
t_Variant(char V[]) { Set(V); }; // Инициализация строкой
// Перегруженные функции члены
void Set(int V) // Присвоение целого значения
{ TypeVal = 1; IVal = V; }
void Set(double V) // Присвоение вещественного значения
{ TypeVal = 2; DVal = V; }
void Set(char V[]) // Присвоение строки
{ TypeVal = 3; strncpy_s(SVal, SLen, V, SLen - 1); }
// Остальные функции члены
int ToInt() // Получение целого значения
{ if (TypeVal == 1) return IVal; else {cout << Err; return 0;} }
double ToDouble() // Получение вещественного значения
{ if (TypeVal == 1 || TypeVal == 2) return DVal; else {cout << Err; return 0;} }
char * ToString() // Получение строки
{ if (TypeVal == 3) return SVal; else {cout << Err; return "";} }
friend char * ConvToStr(t_Variant V, char * Dest); // Дружественная функция
};
char * ConvToStr(t_Variant V, char * Dest) // Дружественная функция
{
switch (V.TypeVal)
{
case 0: strcpy_s(Dest, 100, Err);
break;
case 1: _itoa_s(V.IVal, Dest, 15, 10);
break;
case 2: _gcvt_s(Dest, 20, V.DVal, 10);
break;
case 3: strcpy_s(Dest, 100, V.SVal);
break;
}
return Dest;
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(0, "");
t_Variant Var1; // Создаем пустой экземпляр Var1
cout << Var1.ToInt() << endl; // На экране: *** Нет значения *** и 0
Var1.Set(10); // Записываем в экземпляр Var1 целое значение
cout << Var1.ToInt() << endl; // На экране: 10
Var1.Set(3.14); // Записываем в экземпляр Var1 вещественное значение
cout << Var1.ToDouble() << endl; // На экране: 3.14
Var1.Set("This is text"); // Записываем в экземпляр Var1 строку с усечением
cout << Var1.ToString() << endl; // На экране: This is te
t_Variant Var2(6.28); // Создаем экземпляр Var2 с вещественным значением
cout << Var2.ToDouble() << endl; // На экране: 6.28
t_Variant Var3("Text"); // Создаем экземпляр Var3 с текстовым значением
cout << Var3.ToString() << endl; // На экране: Text
// Использование дружественной функции ConvToStr:
Var3.Set("Друг"); // Записываем в Var3 новое значение
char S[100];
cout << ConvToStr(Var3, S) << endl;
cout << S << endl;
system("Pause");
return 0;
}
Дата добавления: 2019-02-07; просмотров: 220;