Приложение 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; просмотров: 225;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.007 сек.