Файл: Основные понятия объектно-ориентированного программирования (Базовые понятия).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 04.04.2023

Просмотров: 86

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

2.5 Перегрузка методов и операторов

Полиморфизм в C++ проявляется не только на уровне классов, но и на уровне методов. Так, например, мы можем сделать четыре разных конструктора для класса даты (Рисунок 26).

Рисунок 26. Перегрузка конструктора.

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

Для пользовательских типов можно перегружать также операторы, такие как сложение (+), умножение (*), больше (>), равно (==) и другие (Рисунок 27).

Рисунок 27. Перегрузка оператора сложения.

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

2.6 Ключевое слово static

Порой класс нужен лишь для того, чтобы объединить в себе какие-либо – иногда достаточно сложные – операции. В этом случае нет необходимости создавать экземпляр класса. Вместо этого методы помечаются как статичные с помощью ключевого слова static (Рисунок 28).

Рисунок 28. Использование статичных методов.

Статичные методы можно вызывать через оператор ::, как при их определении.

Это не единственное использование данного ключевого слова. Его можно использовать внутри методов и функций при создании объектов (Рисунок 29).

Рисунок 29. Использование слова static внутри функции.

Сколько бы раз не вызывалась функция getDefaultDate, она создаст объект даты лишь один раз, а в дальнейшем будет возвращать его же. Ключевое слово const используется для предотвращения изменения объекта, так как в этом случае функция будет возвращать измененный объект, что является труднонаходимой ошибкой.

2.7 Пространства имен

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


Рисунок 30. Создание пространства имен.

Пространство имен позволяет просто именовать определенный набор классов и функций. Одним из самых известных пространств имен является std, где находятся многие стандартные классы и функции C++. Определив свое пространство имен, его можно использовать, чтобы указать какой именно класс Date предполагается использовать (Рисунок 31).

Рисунок 31. Использование пространства имен.

Конструкция вида пространство имен::имя класса называется полностью квалифицированным именем класса. Если нужно одновременно использовать несколько классов с одинаковым названием, можно воспользоваться псевдонимами классов (Рисунок 32).

Рисунок 32. Использование псевдонима класса.

Глава 3. Разработка консольного приложения

В качестве приложение была выбрана небольшая консольная игра. Цель игры продержаться как можно большее количество ходов. В начале игрок выбирает за какого персонажа он будет играть (Рисунок 33).

Рисунок 33. Выбор персонажа.

За каждого персонажа отвечает свой класс, которые наследуется от базового класса Character. После выбора, в консоль выводится текущее состояние персонажа, а также подсказка по игровому процессу (Рисунок 34).

Рисунок 34. Состояние персонажа и подсказка.

Каждое действие тратит определенное количество очков действий в зависимости от типа персонажа. Если очков действий больше не осталось выводится сообщение о необходимости сна.

Максимальное значение каждого параметра равно 100. Если значение голода, жажды или скуки падает до 0, игра заканчивается и на экран выводится соответствующее сообщение, в зависимости от параметра. Если значение усталости падает до 0, персонаж автоматически засыпает, как если бы игрок вел команду sleep.

Листинги исходного кода приведены в приложении 1.

Заключение

Язык программирования C++ представляет широкие возможности в рамках объектно-ориентированного подхода. Он содержит все необходимые алгоритмические инструменты, а также позволяет писать приложения практически для любой сферы деятельности.


Основные принципы объектно-ориентированного программирования решают проблемы крупных систем, позволяя создавать решения, которые можно развивать и поддерживать долгие годы, не теряясь в огромном количестве повторяющихся функций. В этом помогают как полиморфизм, наследование и инкапсуляция, так и отделение интерфейсов от реализации с помощью заголовочных файлов, пространства имен и другие рассмотренные инструменты.

C++ также был и остается одним из самых высокопроизводительных языков, благодаря чему его продолжают использовать там, где важна скорость работы системы.

Список использованной литературы

Источники на русском языке:

  1. Страуструп, Бьярне. Программирование: принципы и практика с использованием С++, 2-е изд. : Пер. с англ. - М. : ООО "И.Д. Вильямс", 201 6. - 1328 с. :ил. - Парал. тит. англ. ISBN 978-5-8459-1949-6 (рус.)
  2. Липпман С., Лажойе Ж., Му Б. Язык программирования C++. Базовый курс, 5-у изд.: Пер. с англ. – М.: ООО «И.Д. Вильямс», 2014. – 1120 с.: ил. - Парал. тит. англ. ISBN 978-5-8459-1839-0 (рус.)

Источники на английском языке:

  1. Jon Kalb, Gašper Ažman. C++ Today: The Beast Is Back. O'Reilly Media (May 2015) ISBN 978-1491931660

Электронные ресурсы:

  1. Справочник по языку C++ https://msdn.microsoft.com/ru-ru/library/3bstk3k5.aspx (дата обращения 28.11.18)
  2. Фундаментальные типы https://ru.cppreference.com/w/cpp/language/types (дата обращения 28.11.18)
  3. Классы в С++ http://cppstudio.com/post/439/ (дата обращения 29.11.18)
  4. Static: Многоцелевое ключевое слово http://cppstudio.com/post/3298/ (дата обращения 05.12.18)

Приложение 1. Листинги исходного кода игры

Файл Character.h:

#include "pch.h"

#include <string>

#pragma once

using namespace std;

class Character

{

private:

int hunger = 50;

int drought = 50;

int boring = 50;

int wear = 100;

bool alive = true;

protected:

int hungerSpeed;

int droughtSpeed;

int boringSpeed;

int wearSpeed;

int timePointsPerDay;

int timePoints;

virtual void eat();

virtual void drink();

virtual void play();

virtual void sleep();

virtual void spentTime(int time);

virtual void spentParams();

virtual bool checkTime(int time);

virtual void showTimeError();

virtual void checkDeath();

public:

Character();

~Character();

virtual void action(string action_name);

virtual void showInfo();

virtual void processTime(int time);

virtual bool isAlive();

};

Файл Character.cpp:

#include "pch.h"

#include "Character.h"

#include <iostream>

using namespace std;

Character::Character()

{

timePoints = timePointsPerDay;

}

Character::~Character()

{

}

void Character::action(string action_name) {

if (action_name == "eat") {

if (checkTime(hungerSpeed)) {

processTime(hungerSpeed);

eat();

}

else {

showTimeError();

}

}


else if (action_name == "drink") {

if (checkTime(droughtSpeed)) {

processTime(droughtSpeed);

drink();

}

else {

showTimeError();

}

}

else if (action_name == "play") {

if (checkTime(boringSpeed)) {

processTime(boringSpeed);

play();

}

else {

showTimeError();

}

}

else if (action_name == "sleep") {

processTime(wearSpeed);

sleep();

}

else {

cout << "Неверное действие. Пожалуйста, используйте eat, dring, play или sleep \n";

}

if(alive)

showInfo();

}

void Character::eat() {

hunger += 100 / hungerSpeed;

if (hunger > 100) hunger = 100;

}

void Character::drink() {

drought += 100 / droughtSpeed;

if (drought > 100) drought = 100;

}

void Character::play() {

boring += 100 / boringSpeed;

if (boring > 100) boring = 100;

}

void Character::sleep() {

wear = 100;

timePoints = timePointsPerDay;

}

void Character::processTime(int time) {

spentTime(time);

spentParams();

}

void Character::spentTime(int time) {

timePoints -= time;

}

void Character::spentParams() {

hunger -= hungerSpeed;

drought -= droughtSpeed;

boring -= boringSpeed;

wear -= wearSpeed;

checkDeath();

}

bool Character::checkTime(int time) {

return timePoints > time;

}

void Character::showTimeError() {

cout << "Вам нужно поспать \n";

}

void Character::showInfo() {

cout << "Очки голода: " << hunger << "\n";

cout << "Очки жажды: " << drought << "\n";

cout << "Очки скуки: " << boring << "\n";

cout << "Очки усталости: " << wear << "\n";

cout << "Очки действий: " << timePoints << "\n";

}

void Character::checkDeath() {

if (hunger <= 0) {

cout << "Вы умерли от голода \n";

alive = false;

}

else if (drought <= 0) {

cout << "Вы умерли от жажды \n";

alive = false;

}

else if (boring <= 0) {

cout << "Вы умерли от скуки \n";

alive = false;

}

else if (wear <= 0) {

cout << "Вы уснули \n";

sleep();

}

}

bool Character::isAlive() {

return alive;

}

Файл Cat.h:

#include "Character.h"

class Cat :

public Character

{

public:

Cat();

~Cat();

};

Файл Cat.cpp:

#include "pch.h"

#include "Cat.h"

Cat::Cat()

{

hungerSpeed = 6;

droughtSpeed = 2;

boringSpeed = 6;

wearSpeed = 6;

timePointsPerDay = 50;

timePoints = timePointsPerDay;

}

Cat::~Cat()

{

}

Файл Dog.h:

#pragma once

#include "Character.h"

class Dog :

public Character

{

public:

Dog();

~Dog();

};

Файл Dog.cpp:

#include "pch.h"

#include "Dog.h"

Dog::Dog()

{

hungerSpeed = 2;

droughtSpeed = 4;

boringSpeed = 7;

wearSpeed = 9;

timePointsPerDay = 100;

timePoints = timePointsPerDay;

}

Dog::~Dog()

{

}

Файл SynergyGame.cpp (точка входа):

#include "pch.h"

#include <iostream>

#include <string>

#include "Character.h"

#include "Cat.h"

#include "Dog.h"

using namespace std;

Character* getCharacter() {

string characterType;

cin >> characterType;

if (characterType == "cat") {

return new Cat();

}

else if (characterType == "dog") {

return new Dog();

}

else {

cout << "Нет такого персонажа!";

return getCharacter();

}

}

int main()

{

setlocale(LC_ALL, "RUS");

cout << "Выберите персонажа (cat или dog)\n";

Character* character = getCharacter();