Untitled

 avatar
unknown
plain_text
3 years ago
1.9 kB
10
Indexable
#pragma once

#include "identity_document.h"
#include <iostream>
#include <string>

using namespace std::string_view_literals;

class TravelPack {
public:
    operator IdentityDocument() 
    {
        return IdentityDocument();
    }
    TravelPack()
        : identity_doc1_((IdentityDocument*)new Passport())
        , identity_doc2_((IdentityDocument*)new DrivingLicence()) 
    {
            ((IdentityDocument*)this)->vMethod = (void (IdentityDocument::*)()const)&TravelPack::PrintID;
            ((IdentityDocument*)this)->vdel = (void (IdentityDocument::*)())&TravelPack::Delete;
        std::cout << "TravelPack::Ctor()"sv << std::endl;
    }

    TravelPack(const TravelPack& other)
        : identity_doc1_((IdentityDocument*)new Passport(*reinterpret_cast<Passport*>(other.identity_doc1_)))
        , identity_doc2_((IdentityDocument*)new DrivingLicence(*reinterpret_cast<DrivingLicence*>(other.identity_doc2_)))
        , additional_pass_(other.additional_pass_)
        , additional_dr_licence_(other.additional_dr_licence_) 
    {
            IdentityDocument id(reinterpret_cast<const IdentityDocument&>(other));
            ((IdentityDocument*)this)->vMethod = (void (IdentityDocument::*)()const)&TravelPack::PrintID;
            ((IdentityDocument*)this)->vdel = (void (IdentityDocument::*)())&TravelPack::Delete;
        std::cout << "TravelPack::CCtor()"sv << std::endl;
    }

    ~TravelPack() {
        delete identity_doc1_;
        delete identity_doc2_;
        std::cout << "TravelPack::Dtor()"sv << std::endl;
    }

    void PrintID() const {
        identity_doc1_->PrintID();
        identity_doc2_->PrintID();
        additional_pass_.PrintID();
        additional_dr_licence_.PrintID();
    }
    
    void Delete()
    {
        delete this;
    }

private:
    IdentityDocument* identity_doc1_;
    IdentityDocument* identity_doc2_;
    Passport additional_pass_;
    DrivingLicence additional_dr_licence_;
};