//Klasa 'Advert' ma niebanalne skladowe, jest wlascicielem
#include <string>
#include <memory>
#include <iostream>

using namespace std;

class Image { //obiekt jest 'duzy', przechowuje obrazek
public:
    Image(int id) { cout << "C-tor image" << endl; }
    ~Image() { cout << "D-tor image" << endl; }
};

class Audio { //obiekt jest 'duzy', przechowuje nagranie
public:
    Audio(int id) { cout << "C-tor audio" << endl; }
    ~Audio() { cout << "D-tor audio" << endl; }
};

class Text { //obiekt jest 'duzy', przechowuje tekst
public:
    Text(const string& t) { cout << "C-tor text" << endl; }
    ~Text() { cout << "D-tor text" << endl; }
};

class Advert {
public:
    Advert(const string& txt, int image_id, int audio_id)
        : text_(make_unique<Text>(txt)),
          image_(make_unique<Image>(image_id)),
          audio_(make_unique<Audio>(audio_id))
    {
    }
    ~Advert()
    {
    }

    Advert(Advert&& a) : text_(move(a.text_)), image_(move(a.image_)), audio_(move(a.audio_)) {}

    Advert(const Advert& ) = delete;

    Advert& operator=(const Advert& ) = delete;
    Advert& operator=(Advert&&) = delete;
private:
    // Text* text_;
    // Image* image_;
    // Audio* audio_;

    unique_ptr<Text> text_;
    unique_ptr<Image> image_;
    unique_ptr<Audio> audio_;
};

int main() {
    Advert a("hello",0,0);
    return 0;
}
