shushus

Спринт 15. Конструкторы и деструкторы.

May 31st, 2023
905
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.06 KB | None | 0 0
  1. -----------------------------------------------------------------------
  2. main.cpp
  3. -----------------------------------------------------------------------
  4. #include <array>
  5. #include <iostream>
  6. #include <string>
  7.  
  8. #include "identity_document.h"
  9. #include "passport.h"
  10. #include "driving_licence.h"
  11. #include "international_driving_licence.h"
  12. #include "travel_pack.h"
  13.  
  14. using namespace std;
  15.  
  16. void PrintInfo(const IdentityDocument& doc) {doc.PrintID();}
  17. void PrintInfo() {IdentityDocument::PrintUniqueIDCount();}
  18. void PrintInfo(const Passport& pass) {pass.PrintVisa("France"s);}
  19.  
  20. IdentityDocument PrintInfo(int i) {
  21.     Passport pass;
  22.    
  23.     cout << "PrintInfo("sv << i << ")"sv << endl;
  24.     pass.PrintID();
  25.    
  26.     return pass;
  27. }
  28.  
  29. void PrintDrivingLicence(DrivingLicence dr_lic) {dr_lic.PrintID();}
  30.  
  31. int main() {
  32.    
  33.     cout << "Test1"sv << endl;
  34.    
  35.     Passport pass;
  36.     PrintInfo(pass);
  37.     PrintInfo(3).PrintID();
  38.  
  39.     cout << "Test2"sv << endl;
  40.     array<IdentityDocument*, 3> docs = {(IdentityDocument*)(new Passport()),
  41.                                         (IdentityDocument*)(new DrivingLicence()),
  42.                                         (IdentityDocument*)(new Passport())};
  43.    
  44.     for (const auto* doc : docs) {doc->PrintID();}
  45.  
  46.     for (size_t i = 0; i < docs.size(); ++i) {docs[i]->Delete();}
  47.  
  48.     cout << "Test3"sv << endl;
  49.     array<IdentityDocument, 3> docs2 = {Passport(),
  50.                                         DrivingLicence(),
  51.                                         IdentityDocument()};
  52.  
  53.     for (size_t i = 0; i < docs2.size(); ++i) {docs2[i].PrintID();}
  54.  
  55.     PrintInfo(docs2[0]);
  56.  
  57.     cout << "Test4"sv << endl;
  58.    
  59.     IdentityDocument::PrintUniqueIDCount();
  60.  
  61.     cout << "Test5"sv << endl;
  62.    
  63.     Passport pass2;
  64.     pass2.PrintUniqueIDCount();
  65. }
  66. -----------------------------------------------------------------------
  67. identity_document.h
  68. -----------------------------------------------------------------------
  69. #pragma once
  70. #include <iostream>
  71. #include <string>
  72.  
  73. using namespace std::literals;
  74.  
  75. class IdentityDocument {
  76. public:
  77.    
  78.     using PRINT_ID = void(*)(const IdentityDocument*);
  79.     using DELETE = void(*)(IdentityDocument*);
  80.    
  81.     struct Vtable {
  82.         PRINT_ID print_id_;
  83.         DELETE delete_;
  84.     };
  85.    
  86.     static IdentityDocument::Vtable virtual_table;
  87.  
  88.     static void set_virtual_table(IdentityDocument* obj) {*(IdentityDocument::Vtable**)obj = &IdentityDocument::virtual_table;}
  89.  
  90.     const Vtable* get_virtual_table() const {return v_ptr_;}
  91.     Vtable* get_virtual_table() {return v_ptr_;}
  92.    
  93.     IdentityDocument() : unique_id_(++unique_id_count_) {
  94.         IdentityDocument::set_virtual_table(this);
  95.         std::cout << "IdentityDocument::Ctor() : "sv << unique_id_ << std::endl;
  96.     }
  97.  
  98.     IdentityDocument(const IdentityDocument& other) : unique_id_(++unique_id_count_) {
  99.         IdentityDocument::set_virtual_table(this);
  100.         std::cout << "IdentityDocument::CCtor() : "sv << unique_id_ << std::endl;
  101.     }
  102.  
  103.     ~IdentityDocument() {
  104.         unique_id_count_-=1;
  105.         std::cout << "IdentityDocument::Dtor() : "sv << unique_id_ << std::endl;
  106.     }
  107.  
  108.     IdentityDocument& operator=(const IdentityDocument&) = delete;
  109.    
  110.     static void PrintUniqueIDCount() {
  111.         std::cout << "unique_id_count_ : "sv << unique_id_count_ << std::endl;
  112.     }
  113.    
  114.     int GetID() const {return unique_id_;}
  115.    
  116.     void PrintID() const {get_virtual_table()->print_id_(this);}
  117.     static void PrintID(const IdentityDocument* obj) {
  118.         std::cout << "IdentityDocument::PrintID() : "sv << obj->unique_id_ << std::endl;
  119.     }
  120.    
  121.     void Delete() {get_virtual_table()->delete_(this);}
  122.     static void Delete(IdentityDocument* obj) {delete obj;}
  123.    
  124. private:    
  125.     IdentityDocument::Vtable* v_ptr_;
  126.    
  127.     static int unique_id_count_;
  128.     int unique_id_;
  129. };
  130.  
  131. int IdentityDocument::unique_id_count_ = 0;
  132. IdentityDocument::Vtable IdentityDocument::virtual_table = {IdentityDocument::PrintID,
  133.                                                             IdentityDocument::Delete};
  134. -----------------------------------------------------------------------
  135. passport.h
  136. -----------------------------------------------------------------------
  137. #pragma once
  138. #include <iostream>
  139. #include <string>
  140. #include <ctime>
  141.  
  142. #include "identity_document.h"
  143.  
  144. using namespace std::literals;
  145.  
  146. class Passport {
  147. public:
  148.    
  149.     using PRINT_ID = void(*)(const Passport*);
  150.     using DELETE = void(*)(Passport*);
  151.     using PRINT_VISA = void(*)(const Passport*, const std::string& country);
  152.  
  153.     struct Vtable {
  154.         PRINT_ID print_id_;
  155.         DELETE delete_;
  156.         PRINT_VISA print_visa_;
  157.     };
  158.    
  159.     static Passport::Vtable virtual_table;
  160.  
  161.     static void set_virtual_table(Passport* obj) {*(Passport::Vtable**)obj = &Passport::virtual_table;}
  162.  
  163.     const Vtable* get_virtual_table() const {return (const Passport::Vtable*)identity_document_.get_virtual_table();}
  164.     Vtable* get_virtual_table() {return (Passport::Vtable*)identity_document_.get_virtual_table();}
  165.    
  166.     Passport() : identity_document_()
  167.                , expiration_date_(GetExpirationDate()) {
  168.        
  169.         Passport::set_virtual_table(this);
  170.         std::cout << "Passport::Ctor()"sv << std::endl;
  171.     }
  172.  
  173.     Passport(const Passport& other) : identity_document_(other.identity_document_)
  174.                                     , expiration_date_(other.expiration_date_) {
  175.         Passport::set_virtual_table(this);
  176.         std::cout << "Passport::CCtor()"sv << std::endl;
  177.     }
  178.  
  179.     ~Passport() {
  180.         IdentityDocument::set_virtual_table((IdentityDocument*)this);
  181.         std::cout << "Passport::Dtor()"sv << std::endl;
  182.     }
  183.    
  184.     int GetID() const {return identity_document_.GetID();}
  185.     operator IdentityDocument() {return identity_document_;}
  186.  
  187.     void Delete() {get_virtual_table()->delete_(this);}
  188.     static void Delete(Passport* obj) {delete obj;}
  189.    
  190.     void PrintID() const {get_virtual_table()->print_id_(this);}
  191.     static void PrintID(const Passport* obj) {
  192.         std::cout << "Passport::PrintID() : "sv << obj->GetID();
  193.         std::cout << " expiration date : "sv << obj->expiration_date_.tm_mday
  194.                   << "/"sv << obj->expiration_date_.tm_mon
  195.                   << "/"sv << obj->expiration_date_.tm_year + 1900 << std::endl;
  196.     }
  197.  
  198.     void PrintVisa(const std::string& country) const {get_virtual_table()->print_visa_(this, country);}
  199.     static void PrintVisa(const Passport* obj, const std::string& country) {
  200.         std::cout << "Passport::PrintVisa("sv << country << ") : "sv << obj->GetID() << std::endl;
  201.     }
  202.    
  203.     void PrintUniqueIDCount() {IdentityDocument::PrintUniqueIDCount();}
  204.    
  205. private:
  206.     IdentityDocument identity_document_;
  207.     const tm expiration_date_;
  208.  
  209.     tm GetExpirationDate() {
  210.         time_t t = time(nullptr);
  211.         tm exp_date = *localtime(&t);
  212.         exp_date.tm_year += 10;
  213.         mktime(&exp_date);
  214.         return exp_date;
  215.     }
  216. };
  217.  
  218. Passport::Vtable Passport::virtual_table = {Passport::PrintID,
  219.                                             Passport::Delete,
  220.                                             Passport::PrintVisa};
  221. -----------------------------------------------------------------------
  222. driving_licence.h
  223. -----------------------------------------------------------------------
  224. #pragma once
  225. #include <iostream>
  226. #include <string>
  227.  
  228. #include "identity_document.h"
  229.  
  230. using namespace std::literals;
  231.  
  232. class DrivingLicence {
  233. public:
  234.    
  235.     using DELETE = void(*)(DrivingLicence*);
  236.     using PRINT_ID = void(*)(const DrivingLicence*);
  237.  
  238.     struct Vtable {
  239.         PRINT_ID print_id_;
  240.         DELETE delete_;
  241.     };
  242.  
  243.     static DrivingLicence::Vtable virtual_table;
  244.    
  245.     static void set_virtual_table(DrivingLicence* obj) {*(DrivingLicence::Vtable**)obj = &DrivingLicence::virtual_table;}
  246.  
  247.     const Vtable* get_virtual_table() const {return (const DrivingLicence::Vtable*)identity_document_.get_virtual_table();}
  248.     Vtable* get_virtual_table() {return (DrivingLicence::Vtable*)identity_document_.get_virtual_table();}
  249.    
  250.     DrivingLicence() : identity_document_() {
  251.         DrivingLicence::set_virtual_table(this);
  252.         std::cout << "DrivingLicence::Ctor()"sv << std::endl;
  253.     }
  254.  
  255.     DrivingLicence(const DrivingLicence& other) : identity_document_(other.identity_document_) {
  256.         DrivingLicence::set_virtual_table(this);
  257.         std::cout << "DrivingLicence::CCtor()"sv << std::endl;
  258.     }
  259.  
  260.     ~DrivingLicence() {
  261.         IdentityDocument::set_virtual_table((IdentityDocument*)this);
  262.         std::cout << "DrivingLicence::Dtor()"sv << std::endl;
  263.     }
  264.    
  265.     int GetID() const {return identity_document_.GetID();}
  266.     operator IdentityDocument() {return identity_document_;}
  267.    
  268.     void Delete() {get_virtual_table()->delete_(this);}
  269.     static void Delete(DrivingLicence* obj) {delete obj;}
  270.  
  271.     void PrintID() const {get_virtual_table()->print_id_(this);}
  272.     static void PrintID(const DrivingLicence* obj) {std::cout << "DrivingLicence::PrintID() : "sv << obj->GetID() << std::endl;}
  273.    
  274.     void PrintUniqueIDCount() {IdentityDocument::PrintUniqueIDCount();}
  275.  
  276. private:
  277.     IdentityDocument identity_document_;
  278. };
  279.  
  280. DrivingLicence::Vtable DrivingLicence::virtual_table = {DrivingLicence::PrintID,
  281.                                                         DrivingLicence::Delete};
  282. -----------------------------------------------------------------------
  283. international_driving_licence.h
  284. -----------------------------------------------------------------------
  285. #pragma once
  286. #include <iostream>
  287. #include <string>
  288.  
  289. #include "driving_licence.h"
  290.  
  291. using namespace std::literals;
  292.  
  293. class InternationalDrivingLicence {
  294. public:
  295.    
  296.     using DELETE = void(*)(InternationalDrivingLicence*);
  297.     using PRINT_ID = void(*)(const InternationalDrivingLicence*);
  298.  
  299.     struct Vtable {
  300.         PRINT_ID print_id_;
  301.         DELETE delete_;
  302.     };
  303.    
  304.     static InternationalDrivingLicence::Vtable virtual_table;
  305.  
  306.     static void set_virtual_table(InternationalDrivingLicence* obj) {*(InternationalDrivingLicence::Vtable**)obj
  307.                                                                     = &InternationalDrivingLicence::virtual_table;}
  308.  
  309.     const Vtable* get_virtual_table() const {return (const InternationalDrivingLicence::Vtable*)driving_licence_.get_virtual_table();}
  310.     Vtable* get_virtual_table() {return (InternationalDrivingLicence::Vtable*)driving_licence_.get_virtual_table();}
  311.    
  312.     InternationalDrivingLicence() : driving_licence_() {
  313.         InternationalDrivingLicence::set_virtual_table(this);
  314.         std::cout << "InternationalDrivingLicence::Ctor()"sv << std::endl;
  315.     }
  316.  
  317.     InternationalDrivingLicence(const InternationalDrivingLicence& other) : driving_licence_(other.driving_licence_) {
  318.         InternationalDrivingLicence::set_virtual_table(this);
  319.         std::cout << "InternationalDrivingLicence::CCtor()"sv << std::endl;
  320.     }
  321.  
  322.     ~InternationalDrivingLicence() {
  323.         DrivingLicence::set_virtual_table((DrivingLicence*)this);
  324.         std::cout << "InternationalDrivingLicence::Dtor()"sv << std::endl;
  325.     }
  326.    
  327.     int GetID() const {return driving_licence_.GetID();}
  328.     operator DrivingLicence() const {return driving_licence_;}
  329.  
  330.     void Delete() {get_virtual_table()->delete_(this);}
  331.     static void Delete(InternationalDrivingLicence* obj) {delete obj;}
  332.  
  333.     void PrintID() const {get_virtual_table()->print_id_(this);}
  334.     static void PrintID(const InternationalDrivingLicence* obj) {std::cout << "InternationalDrivingLicence::PrintID() : "sv << obj->GetID() << std::endl;}
  335.    
  336. private:
  337.     DrivingLicence driving_licence_;  
  338. };
  339.  
  340. InternationalDrivingLicence::Vtable InternationalDrivingLicence::virtual_table = {InternationalDrivingLicence::PrintID,
  341.                                                                                   InternationalDrivingLicence::Delete};
  342. -----------------------------------------------------------------------
  343. travel_pack.h
  344. -----------------------------------------------------------------------
  345. #pragma once
  346. #include <iostream>
  347. #include <string>
  348.  
  349. #include "identity_document.h"
  350.  
  351. using namespace std::literals;
  352.  
  353. class TravelPack {
  354. public:
  355.    
  356.     using DELETE = void(*)(TravelPack*);
  357.     using PRINT_ID = void(*)(const TravelPack*);
  358.  
  359.     struct Vtable {
  360.         PRINT_ID print_id_;
  361.         DELETE delete_;
  362.     };
  363.    
  364.     static TravelPack::Vtable virtual_table;
  365.  
  366.     static void set_virtual_table(TravelPack* obj) {*(TravelPack::Vtable**)obj = &TravelPack::virtual_table;}
  367.  
  368.     const Vtable* get_virtual_table() const {return (const TravelPack::Vtable*)identity_document_.get_virtual_table();}
  369.     Vtable* get_virtual_table() {return (TravelPack::Vtable*)identity_document_.get_virtual_table();}
  370.    
  371.     TravelPack() : identity_document_()
  372.                  , identity_doc1_((IdentityDocument*)(new Passport()))
  373.                  , identity_doc2_((IdentityDocument*)(new DrivingLicence())) {
  374.        
  375.         TravelPack::set_virtual_table(this);
  376.         std::cout << "TravelPack::Ctor()"sv << std::endl;
  377.     }
  378.  
  379.     TravelPack(const TravelPack& other) : identity_document_(other.identity_document_)
  380.                                         , identity_doc1_((IdentityDocument*)(new Passport(*(Passport*)(other.identity_doc1_))))
  381.                                         , identity_doc2_((IdentityDocument*)(new DrivingLicence(*(DrivingLicence*)(other.identity_doc2_))))
  382.                                         , additional_pass_(other.additional_pass_)
  383.                                         , additional_dr_licence_(other.additional_dr_licence_) {
  384.        
  385.         TravelPack::set_virtual_table(this);
  386.         std::cout << "TravelPack::CCtor()"sv << std::endl;
  387.     }
  388.  
  389.     ~TravelPack() {
  390.         identity_doc1_->Delete();
  391.         identity_doc2_->Delete();
  392.         IdentityDocument::set_virtual_table((IdentityDocument*)this);
  393.         std::cout << "TravelPack::Dtor()"sv << std::endl;
  394.     }
  395.    
  396.     int GetID() const {return identity_document_.GetID();}
  397.     operator IdentityDocument() {return identity_document_;}
  398.  
  399.     void Delete() {get_virtual_table()->delete_(this);}
  400.     static void Delete(TravelPack* obj) {delete obj;}
  401.  
  402.     void PrintID() const {get_virtual_table()->print_id_(this);}
  403.     static void PrintID(const TravelPack* obj) {
  404.         obj->identity_doc1_->PrintID();
  405.         obj->identity_doc2_->PrintID();
  406.         obj->additional_pass_.PrintID();
  407.         obj->additional_dr_licence_.PrintID();
  408.     }
  409.  
  410.     void PrintUniqueIDCount() {IdentityDocument::PrintUniqueIDCount();}
  411.  
  412. private:
  413.     IdentityDocument identity_document_;
  414.    
  415.     IdentityDocument* identity_doc1_;
  416.     IdentityDocument* identity_doc2_;
  417.    
  418.     Passport additional_pass_;
  419.     DrivingLicence additional_dr_licence_;
  420. };
  421.  
  422. TravelPack::Vtable TravelPack::virtual_table = {TravelPack::PrintID,
  423.                                                 TravelPack::Delete};
  424. -----------------------------------------------------------------------
  425. main_origin.cpp
  426. -----------------------------------------------------------------------
  427.  
  428. empty
  429.  
Advertisement
Add Comment
Please, Sign In to add comment