Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
01.11.2025
Размер:
3.79 Кб
Скачать
#include <iostream>
#include <cstring>
#include <windows.h>
using namespace std;

class Flower {
private:
    int num;
    int height;
    char* name;
    
public:
    // Исправленный конструктор - правильный порядок параметров по умолчанию
    Flower(int n = 10, int h = 20, const char* nm = "Rose") : num(n), height(h) {
        name = new char[strlen(nm) + 1];
        strcpy(name, nm);
        cout << "Создан цветок: " << name << ", количество: " << num << ", высота: " << height << " см" << endl;
    }
    
    // Конструктор копирования
    Flower(const Flower& other) : num(other.num), height(other.height) {
        name = new char[strlen(other.name) + 1];
        strcpy(name, other.name);
        cout << "Создана копия цветка: " << name << endl;
    }
    
    // Оператор присваивания
    Flower& operator=(const Flower& other) {
        if (this != &other) {
            delete[] name;
            num = other.num;
            height = other.height;
            name = new char[strlen(other.name) + 1];
            strcpy(name, other.name);
        }
        return *this;
    }
    
    ~Flower() { 
        cout << "Удален цветок: " << name << endl;
        delete[] name; 
    }
    
    void print() const {
        cout << "Цветок: " << name << ", количество: " << num << ", высота: " << height << " см" << endl;
    }
};

class Garden {
private:
    Flower* f; // изменено с ссылки на указатель
    
public:
    // Конструктор по умолчанию
    Garden() : f(nullptr) {
        cout << "Создан пустой сад" << endl;
    }
    
    // Деструктор
    ~Garden() {
        cout << "Сад удален" << endl;
    }
    
    void add_flower(Flower& f1) { 
        f = &f1;
        cout << "Цветок добавлен в сад" << endl;
    }
    
    void print() const {
        if (f != nullptr) {
            cout << "В саду находится: ";
            f->print();
        } else {
            cout << "Сад пуст" << endl;
        }
    }
};

int main() {
    SetConsoleOutputCP(65001);
    SetConsoleCP(65001);
    
    cout << "=== Задание 2.14 - Анализ ошибок ===" << endl;
    
    cout << "\nИсходные ошибки в программе:" << endl;
    cout << "1. В конструкторе Flower: параметры по умолчанию должны быть в конце" << endl;
    cout << "2. В конструкторе Flower: имя параметра 'mm' не соответствует использованию 'nm'" << endl;
    cout << "3. В классе Garden: член f объявлен как ссылка, но не инициализирован" << endl;
    cout << "4. В функции add_flower: присваивание ссылки другой ссылке" << endl;
    
    cout << "\nИсправленная программа:" << endl;
    
    Garden g;
    Flower f;
    
    cout << "\nДобавление цветка в сад:" << endl;
    g.add_flower(f);
    
    cout << "\nСостояние сада:" << endl;
    g.print();
    
    cout << "\nСоздание дополнительных цветков:" << endl;
    Flower f2(5, 30, "Tulip");
    Flower f3(15); // используется значение по умолчанию для высоты и имени
    
    cout << "\nРабота программы завершена успешно!" << endl;
    
    return 0;
}
Соседние файлы в папке Лаба2