/*
    Конструктор

    Конструктор - это специальный метод, который вызывается при создании объекта

    Конструктор  Book(const char aTitle[], float aPrice, int aPages)  принимает три аргумента и задаёт
    этими аргументами поля класса, а также печатает на экран слово Constructor.

    Конструктор вызывается в строке  Book a = Book("War and Peace", 1700, 900).
    В этом примере конструктор делает то же самое, что и обычная инициализация структуры:  Book a = {"War and Peace", 1700, 900};
    Преимущество конструктора по сравнению с обычной инициализации структур состоит в том, что программист может сам задать то, 
    что будет происходить при создании объекта.


    Напоминание:
        Функция strcpy из библиотеки string.h языка C принимает на вход 2 строки и просто копирует 
        содержимое второй строки в первую строку.

*/

#include <iostream>
#include <cmath>
#include <string.h>
using std::cout, std::endl;


struct Book 
{
    char title[100];
    float price;
    int pages;

    Book(const char aTitle[], float aPrice, int aPages)
    {
        cout << "Constructor" << endl;
        strcpy(title, aTitle);
        price = aPrice;
        pages = aPages;
    }


    void print() const
    {
        std::cout << title << ", price = " << price << ", pages = " << pages << std::endl;
    }
};



int main() 
{
    Book a = Book("War and Peace", 1700, 900);
    a.print();

    Book b = Book("The Great Gatsby", 800, -600);
    b.print();

}


/*
    Задачи:

        1)  Предположим, что программист, работая с наши классом Book, ошибся в конструкторе и установил у книги отрицательное количество страниц.

            Измените конструктор таким образом, чтобы программа не создавала объект с отрицательным числом страниц.
            Вместо этого она должна писать сообщение об ошибке и выходить из программы.
            Для выхода из программы можно использовать функцию std::exit(1) из библиотеки <cstdlib>


        2)  Конструкторы можно перегружать также, как и обычные функции и методы.
            Добавьте новый конструктор, который не будет принимать никаких аргументов и будет создавать объект с полями равными
            title: "Default"  price: 0   pages: 0
            Вызовите этот конструктор из main

            Конструктор, который не принимает аргументов, называется конструктором по умолчанию.



        3)  Конструкторы можно перегружать также, как и обычные функции и методы.
            Добавьте новый конструктор, который будет принимать объект типа Book (по константной ссылке)
            и будет задавать поля текущего объекта, используя поля аргумента
            Вызовите этот конструктор из main
            
            Конструктор, который создаёт объект, используя объект такого-же типа, называется конструктором копирования.
*/