1

Тема: Класи. Видалення масиву

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<ctime>
#include <string>
#include <iomanip>
using namespace std;

class User
{
private:

};

class Admin
{
private:

};

class CoffeeBox
{
private:
    struct Coffee
    {
        string coffee_type;
        double coffee_price;
    };
    struct Adds
    {
        string add;
        double add_price;
    };
    int size_coffee;
    int size_adds;
    Coffee *c_types;
    Adds *a_types;
    double cash;
public:
    CoffeeBox()
    {
        size_coffee = 0;
        size_adds = 0;
        c_types = new Coffee[size_coffee];
        a_types = new Adds[size_adds];
        cash = 0;
    }

    CoffeeBox(string type_of_coffee, double c_price, string type_of_add, double a_price)
    {
        ++size_coffee;
        ++size_adds;
        c_types[size_coffee - 1].coffee_type = type_of_coffee;
        a_types[size_adds - 1].add = type_of_add;
        c_types[size_coffee - 1].coffee_price = c_price;
        a_types[size_adds - 1].add_price = a_price;
        cash = 0;
    }

    void show_adds()
    {
        cout << setw(15) << "\tNAME" << "PRICE" << endl;
        for (int i = 0; i < size_adds; i++)
        {
            cout << i + 1 << ". " << setw(12) << left << a_types[i].add << setw(5) << left << a_types[i].add_price<< endl;
        }
    }

    void show_coffees()
    {
        cout << setw(15) << "\tNAME" << "PRICE" << endl;
        for (int i = 0; i < size_adds; i++)
        {
            cout << i + 1 << ". " << setw(12) << left << c_types[i].coffee_type << setw(5) << left << c_types[i].coffee_price << endl;
        }
    }

    void add_coffee()
    {
        Coffee *new_coffee = new Coffee[size_coffee + 1];
        char choice;
        do
        {
            for (int i = 0; i < size_coffee; i++)
            {
                new_coffee[i] = c_types[i];
            }
            cout << "Enter the name of new coffee :";
            cin >> new_coffee[size_coffee + 1].coffee_type;
            cout << "Enter the price :";
            cin >> new_coffee[size_coffee + 1].coffee_price;
            size_coffee++;
            c_types = new_coffee;
            do
            {
                cout << "Add another coffee type? y/n :";
                cin >> choice;
            } while (choice != 'y' && choice != 'n');
        } while (choice != 'n');
    }

    double cash_operations(double sum)
    {

    }
};

У рядку 92 я роблю перепосилання основного масиву на копію (c_types = new_coffee;). В звичайних умовах я втрачав би пам'ять, але у класів є власні деструктори. Питання полягає в тому чи потрібно явно видаляти масив чи деструктор зробить свою роботу?
Дякую

2

Re: Класи. Видалення масиву

Це C++. Тут немає автоматичного звільнення пам'яті збирачем сміття, все - тільки вручну:

delete[] c_types; //звільнити стару пам'ять
c_types = new_coffee; //встановити новий вказівник

Деструктор викликається тільки явно, операцією delete. Втім, у вас тут деструкторів немає.

3 Востаннє редагувалося boshik1983 (29.11.2016 17:51:24)

Re: Класи. Видалення масиву

Ніби не зовсім так:
Деструктор в об’єктно-орієнтованому програмуванні — спеціальний метод класу, який викликається автоматично при знищенні об'єкта і призначений для його деініціалізації (наприклад звільнення пам'яті). https://uk.wikipedia.org/wiki/Деструкто … рамування)
І Дейтел пише, що деструктори автоматично викликаються для класів і створбвати їх не потрібно (перший зайшов - останній вийшов). Чи я щось не так розумію?

4

Re: Класи. Видалення масиву

Ви неправильно розумієте.
Деструктор викликається при знищенні об'єкта:

{
  MyClass a;
  MyClass *b = new MyClass();
  MyClass *lost = new MyClass();
  delete b;//тут знищується об'єкт, на який посилається b, і викликається його деструктор
}//область видимості a скінчилася, він знищується, і автоматично(!) викликається його деструктор
//а об'єкт, на який посилався lost, не знищується, і його деструктор не викликається. Маємо витік пам'яті

Деструктори потрібні тим класам, які самостійно виділяють ресурси - наприклад, оператором new, для того, щоб їх звільнити. Якщо клас таких ресурсів не використовує - то йому дійсно не потрібен деструктор.

5

Re: Класи. Видалення масиву

Ок. Дякую. Я власне так і думав, але толкового пояснення не міг знайти.