Пример программы с использованием созданных классов




Теоретический материал

Перегрузка операторов — в программировании — один из способов реализации полиморфизма, заключающийся в возможности одновременного существования в одной области видимости нескольких различных вариантов применения оператора, имеющих одно и то же имя, но различающихся типами параметров, к которым они применяются.

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

· Чтобы разрешить существование нескольких одноимённых операций, достаточно ввести в язык правило, согласно которому операция (процедура, функция или оператор) опознаются компилятором не только по имени (обозначению), но и по типам их параметров. Таким образом, abs(i), где i объявлено как целое, и abs(x), где x объявлено как вещественное — это две разные операции. Принципиально в обеспечении именно такой трактовки нет никаких сложностей.

· Чтобы дать возможность определять и переопределять операции, необходимо ввести в язык соответствующие синтаксические конструкции. Вариантов их может быть достаточно много, но по сути они ничем друг от друга не отличаются, достаточно помнить, что запись вида «<операнд1> <знакОперации> <операнд2>» принципиально аналогична вызову функции «<знакОперации>(<операнд1>,<операнд2>)».

Индивидуальное задание №1

Задание: (конструктор копирования и оператор присваивания). Создать иерархию классов человек и служащий. Переопределить вывод в поток и ввод из потока, конструктор копирования, оператор присваивания через соответствующие функции базового класса.

Диаграмма классов

 

Описание

Класс Human:

Поля класса:

· name_ – имя человека

· surname_ – фамилия

· gender_ – пол

Методы класса:

· set-методы: set_name, set_surname, set_genderB, set_genderL

· get-методы: get_name, get_surname, get_gender

· del_name – очистка памяти, выделяемой под строки имени и фамилии

 

Класс employee – наследник класса Human:

Поля класса:

· company_ – рабочая компания

· employment_duration – длительность работы (лет)

 

Методы класса:

· set-методы: set_company, set_duration

· get-методы: get_company, get_duration

· operator= – перегруженный оператор присваивания

· operator<<, operator>> - перегруженные операторы вывода и ввода в поток (друзья)

Исходный код

Human.h

#pragma once

#include "stdio.h"

#include <iostream>

#include <stdlib.h>

#include <cstring>

using namespace std;

 

class Human

{

private:

char* name_; char* surname_; bool gender_;

public:

Human();

Human(char* Name, char* Sur, bool M_W);

void set_name (char* Name);

void set_surname (char* Sur);

void set_genderL (char & G);

void set_genderB (bool F);

void del_name();

~Human();

char* get_surname() const;

char* get_name() const;

bool get_gender() const;

 

};

Human.cpp

#define _CRT_SECURE_NO_WARNINGS

#include "Human.h"

 

Human::Human()

{

name_=(char*) calloc(1, sizeof(char*));

surname_=(char*) calloc(1, sizeof(char*));

};

Human::Human(char* Name, char* Sur, bool M_W)

{

name_=(char*) calloc (1+strlen(Name), sizeof(char*));

strcpy(name_, Name);

surname_=(char*) calloc (1+strlen(Sur), sizeof(char*));

strcpy(surname_, Sur);

gender_=M_W;

};

 

void Human::set_name (char* Name)

{

name_=(char*) realloc (name_, (1+strlen(Name))*sizeof(char*));

strcpy(name_, Name);

};

char* Human::get_name() const

{

return name_;

};

void Human::del_name()

{

free(name_);

free(surname_);

};

Human::~Human()

{

del_name();

}

void Human::set_surname (char* Sur)

{

surname_=(char*) realloc (surname_, (1+strlen(Sur))*sizeof(char*));

strcpy(surname_, Sur);

};

char* Human::get_surname() const

{

return surname_;

};

void Human::set_genderL(char& G)

{

if (G==77) gender_=true;

else gender_=false;

};

void Human::set_genderB(bool F) const

{

gender_=F;

};

bool Human::get_gender() const

{

return gender_;

};

Employee.h

#pragma once

#include "Human.h"

 

class employee:

public Human

{

friend ostream &operator<<(ostream & os, const employee &entry);

friend istream &operator>>(istream & os, employee &entry);

 

private:

char* company_;

int employment_duration;

public:

employee();

employee (char* company, int duration, char* Name, char* Sur, bool M_W);

employee (const employee & entry);

void set_company (char* Name);

char* get_company() const;

~employee();

void set_duration (int & prolong);

int get_duration() const;

employee & operator=(const employee & st);

 

};

Employee.cpp

#define _CRT_SECURE_NO_WARNINGS

#include "employee.h"

using namespace std;

 

 

employee::employee()

:Human()

{

company_=(char*) calloc(1, sizeof(char*));

};

employee::employee (char* company, int duration, char* Name, char* Sur, bool M_W)

: Human (Name, Sur, M_W)

{

employment_duration=duration;

company_=(char*) calloc (1+strlen(company), sizeof(char*));

strcpy(company_, company);

};

employee::employee (const employee & entry)

{

employment_duration=entry.employment_duration;

company_=(char*) realloc (company_, (1+strlen(entry.company_))*sizeof(char*));

strcpy(company_, entry.company_);

 

set_name(entry.get_name());

set_surname(entry.get_surname());

set_genderB(entry.get_gender());

};

void employee::set_company (char* Name)

{

company_=(char*) realloc (company_, (1+strlen(Name))*sizeof(char*));

strcpy(company_, Name);

};

char* employee::get_company() const

{

return company_;

};

employee::~employee()

{

free(company_);

del_name();

};

void employee::set_duration (int & prolong)

{

employment_duration=prolong;

};

int employee::get_duration() const

{

return employment_duration;

};

ostream &operator<<(ostream & os, const employee &entry)

{

os<<"Name: "<<entry.get_name()<<" "<<entry.get_surname()<<endl;

return os;

};

istream &operator>>(istream & os, employee &entry)

{

char A,B;

os>>A>>B>>entry.company_;

entry.set_name(&A);

entry.set_surname(&B);

return os;

};

employee & employee::operator=(const employee & st)

{

if (this==&st)

return *this;

company_=(char*) realloc (company_, (1+strlen(st.get_company()))*sizeof(char*));

strcpy(company_, st.get_company());

employment_duration=st.get_duration();

 

set_name(st.get_name());

set_surname(st.get_surname());

set_genderB(st.get_gender());

return *this;

};

 

Пример программы с использованием созданных классов

#include "employee.h"

 

int main()

{

employee man("Apple", 4, "Biggie", "Jefferson", true);

employee man_0;

man_0=man;

cout<<man_0;

system("PAUSE");

return 0;

}




Поделиться:




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

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


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