Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 07
diff options
context:
space:
mode:
Commit8cf1283a4ffb9fe1901c29c087fa376de82726af (patch)
Author
 angeld55 <angel_dimitriev@abv.bg>
2022-02-19 23:30:52 +0200
Committer
 angeld55 <angel_dimitriev@abv.bg>
2022-02-19 23:30:52 +0200
Filesabdfe6bf526100dcce87a88563100e02adf7605e /Sem. 07
Object-oriented_programming_FMI-8cf1283a4ffb9fe1901c29c087fa376de82726af.tar
Object-oriented_programming_FMI-8cf1283a4ffb9fe1901c29c087fa376de82726af.tar.gz
Object-oriented_programming_FMI-8cf1283a4ffb9fe1901c29c087fa376de82726af.zip
Parentd73a7ec225516657dec74472a0491330e9999217 (diff)
clean up
7 files changed, 0 insertions, 309 deletions
-rw-r--r--Sem. 07/Person/Person.cpp40
-rw-r--r--Sem. 07/Person/Person.h19
-rw-r--r--Sem. 07/Person/Source.cpp16
-rw-r--r--Sem. 07/PersonAdvanced/PersonAdvanced.cpp69
-rw-r--r--Sem. 07/PersonAdvanced/PersonAdvanced.h28
-rw-r--r--Sem. 07/PersonAdvanced/Source.cpp16
-rw-r--r--Sem. 07/README.md121
diff --git a/Sem. 07/Person/Person.cpp b/Sem. 07/Person/Person.cpp
deleted file mode 100644
index 2786671..0000000
--- a/Sem. 07/Person/Person.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#include <iostream>
-#include "Person.h"
-
-Person::Person(const char* name, int age)
-{
- setName(name);
- setAge(age);
-}
-
-
-void Person::setName(const char* name)
-{
- if (strlen(name) >= 20)
- {
- strcpy(this->name, "Unknown");
- }
- else
- {
- strcpy(this->name, name);
- }
-}
-
-void Person::setAge(int age)
-{
- if (age<0 || age > 120)
- age = 40;
- this->age = age;
-}
-const char* Person::getName() const
-{
- return name;
-}
-int Person::getAge() const
-{
- return age;
-}
-void Person::print()
-{
- std::cout << name << " " << age << std::endl;
-} \ No newline at end of file
diff --git a/Sem. 07/Person/Person.h b/Sem. 07/Person/Person.h
deleted file mode 100644
index 499c744..0000000
--- a/Sem. 07/Person/Person.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#pragma once
-
-class Person
-{
-public:
- Person(const char* name, int age);
-
- void setName(const char* name);
- void setAge(int age);
-
- const char* getName() const;
- int getAge() const;
-
- void print();
-
-private:
- char name[20];
- int age;
-};
diff --git a/Sem. 07/Person/Source.cpp b/Sem. 07/Person/Source.cpp
deleted file mode 100644
index 478d07a..0000000
--- a/Sem. 07/Person/Source.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <iostream>
-#include "Person.h"
-using namespace std;
-
-int main()
-{
- Person p("Ivan", 13);
- Person p2("Petur", 12);
-
- p = p2;
-
- p2.setName("Aleks");
- p.print();
- p2.print();
-
-}
diff --git a/Sem. 07/PersonAdvanced/PersonAdvanced.cpp b/Sem. 07/PersonAdvanced/PersonAdvanced.cpp
deleted file mode 100644
index e4e062f..0000000
--- a/Sem. 07/PersonAdvanced/PersonAdvanced.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#include "PersonAdvanced.h"
-#include <iostream>
-
-PersonAdvanced::PersonAdvanced(const char* name, int age) : name(nullptr), age(age)
-{
- setName(name);
- setAge(age);
-}
-
-PersonAdvanced::PersonAdvanced(const PersonAdvanced& other)
-{
- copyFrom(other);
-}
-
-PersonAdvanced& PersonAdvanced::operator = (const PersonAdvanced& other)
-{
- if (this != &other)
- {
- free();
- copyFrom(other);
- }
- return *this;
-}
-PersonAdvanced::~PersonAdvanced()
-{
- free();
-}
-
-const char* PersonAdvanced::getName() const
-{
- return name;
-}
-
-int PersonAdvanced::getAge() const
-{
- return age;
-}
-
-void PersonAdvanced::setName(const char* name)
-{
- delete[] this->name;
- this->name = new char[strlen(name) + 1];
- strcpy(this->name, name);
-}
-void PersonAdvanced::setAge(int age)
-{
- if (age < 0 || age > 120)
- age = 40;
- this->age = age;
-}
-
-
-void PersonAdvanced::copyFrom(const PersonAdvanced& other)
-{
- name = new char[strlen(other.name) + 1];
- strcpy(name, other.name);
-
- age = other.age;
-}
-void PersonAdvanced::free()
-{
- delete[] name;
- age = 0;
-}
-
-void PersonAdvanced::print()
-{
- std::cout <<"Name: "<< name << ", age: " << age << std::endl;
-} \ No newline at end of file
diff --git a/Sem. 07/PersonAdvanced/PersonAdvanced.h b/Sem. 07/PersonAdvanced/PersonAdvanced.h
deleted file mode 100644
index 92e000e..0000000
--- a/Sem. 07/PersonAdvanced/PersonAdvanced.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#pragma once
-
-class PersonAdvanced
-{
-public:
- PersonAdvanced(const char* name, int age);
-
- PersonAdvanced(const PersonAdvanced& other);
- PersonAdvanced& operator=(const PersonAdvanced& other);
- ~PersonAdvanced();
-
- void setName(const char* name);
- void setAge(int age);
-
- const char* getName() const;
- int getAge() const;
-
- void print();
-
-private:
-
- void copyFrom(const PersonAdvanced& other);
- void free();
-
-
- char* name;
- int age;
-};
diff --git a/Sem. 07/PersonAdvanced/Source.cpp b/Sem. 07/PersonAdvanced/Source.cpp
deleted file mode 100644
index 8c92e6c..0000000
--- a/Sem. 07/PersonAdvanced/Source.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <iostream>
-#include "PersonAdvanced.h"
-using namespace std;
-
-int main()
-{
- PersonAdvanced p("Ivan", 13);
- PersonAdvanced p2("Petur", 12);
-
- p = p2;
-
- p2.setName("Aleks");
- p.print();
- p2.print();
-
-}
diff --git a/Sem. 07/README.md b/Sem. 07/README.md
deleted file mode 100644
index 1d3b9a6..0000000
--- a/Sem. 07/README.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# Голямата четворка (Rule of four)
-
- - Конструктор по подразбиране (конструктор без параметри)
- - Конструктор за копиране
- - Оператор =
- - Деструктор
-
-Да разгледаме следната структура:
-```c++
-struct Test
-{
- char str[20];
- A obj2;
- B obj3;
-};
- ```
- Понеже функциите (от голямата четворка) не са дефинирани в структурата, то компилаторът ще създаде такива:
- ```c++
-int main()
-{
- Test currentObject; //default constructor
-
- Test object2(currentObject); //copy constructor
-
- currentObject = object2; //operator =
-
-} //destructor (x2)
- ```
- Кодът се компилира успешно и функциите имат правилно поведение.
-### Как работят дефинираните от компилатора функции?
- Всяка една от тезу функции **извиква рекурсивно същите функции връху член-данните.**
- #### Пример за конструктора по подразбиране:
-
-![enter image description here](https://i.ibb.co/s2m8XtC/1.png)
-
- #### Пример за деструктора:
-![enter image description here](https://i.ibb.co/kmYSzP7/2.png)
-
- #### Пример за копиращия конструктор:
-![enter image description here](https://i.ibb.co/9Vqk7Mn/3.png)
-### Проблем при функциите, генерирани от компилатора:
-
-Да разгледаме следния код:
-
- ```c++
-struct Person
-{
- PersonA(const char* name, int age)
- {
- this->name = new char[strlen(name) + 1];
- strcpy(this->name, name);
- this->age = age;
- }
-private:
-
- char* name;
- int age;
-};
-
-int main()
-{
- Person p1;
- Person p2(p1);
-}
-
- ```
- Горното извикване на копиращия конструктор има **грешено поведение**:
-
-![enter image description here](https://i.ibb.co/q5rfGBf/Capture.png)
-
-
-Това е **shallow copy**. В p2 са се копирали стойностите на p1, което довежда до споделяне на една и съща динамична памет.
-В тази ситуация ще трябва да се имплементират експлицитно **копиращия конструктор, оператора за присвояване и деструктора**, защото генерираните от компилатора не биха работили правилно.
-
-**Правилното поведение** на копиращия конструктор е следното:
-
-![enter image description here](https://i.ibb.co/XZq5rGT/33.png)
-
-### Собствена имплементация на функциите за копиране и деструктора
-
- ```c++
-struct Person
-{
- Person(const char* name, int age) : name(nullptr), age(age)
- {
- setName(name);
- setAge(age);
- }
-
- Person(const Person& other)
- {
- copyFrom(other); // копираме
- }
-
- Person& operator=(const Person& other)
- {
- if (this != &other)
- {
- free(); //трием
- copyFrom(other); //копираме
- }
- return *this;
- }
- ~Person()
- {
- free(); //трием
- }
-
- .
- .
- .
-
-
-
-};
-
- ```
-
-При всички класове, които използват динамична памет, тези функции изглеждат по този начин. Разликите са в имплементациите на функциите **free** и **copyFrom**.
-
-