diff options
clean up
7 files changed, 0 insertions, 309 deletions
| -rw-r--r-- | Sem. 07/Person/Person.cpp | 40 | ||||
| -rw-r--r-- | Sem. 07/Person/Person.h | 19 | ||||
| -rw-r--r-- | Sem. 07/Person/Source.cpp | 16 | ||||
| -rw-r--r-- | Sem. 07/PersonAdvanced/PersonAdvanced.cpp | 69 | ||||
| -rw-r--r-- | Sem. 07/PersonAdvanced/PersonAdvanced.h | 28 | ||||
| -rw-r--r-- | Sem. 07/PersonAdvanced/Source.cpp | 16 | ||||
| -rw-r--r-- | Sem. 07/README.md | 121 |
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) - ``` - Кодът се компилира успешно и функциите имат правилно поведение. -### Как работят дефинираните от компилатора функции? - Всяка една от тезу функции **извиква рекурсивно същите функции връху член-данните.** - #### Пример за конструктора по подразбиране: - - - - #### Пример за деструктора: - - - #### Пример за копиращия конструктор: - -### Проблем при функциите, генерирани от компилатора: - -Да разгледаме следния код: - - ```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); -} - - ``` - Горното извикване на копиращия конструктор има **грешено поведение**: - - - - -Това е **shallow copy**. В p2 са се копирали стойностите на p1, което довежда до споделяне на една и съща динамична памет. -В тази ситуация ще трябва да се имплементират експлицитно **копиращия конструктор, оператора за присвояване и деструктора**, защото генерираните от компилатора не биха работили правилно. - -**Правилното поведение** на копиращия конструктор е следното: - - - -### Собствена имплементация на функциите за копиране и деструктора - - ```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**. - - |
