1

Тема: Створіть клас Масив із конструкторами, деструктором та перевантаженими

Добрий день,є ось таке завданнячко:створіть клас Масив із конструкторами, деструктором та перевантаженими операторами [], =, ++, -- (збільшення та зменшення на одиницю всіх елементів масиву), <<, >>. Продемонструйте роботу із створеним масивом.
Ось код ,а питання полягає в тому ,як можно "простіше написати цей код"

#include <iostream>
#include <ostream>
using namespace std;
class Array {
public:
    explicit Array(const std::size_t size) : size{ size }, data{ new int[size] } {}
    Array(const Array &other) : size{ other.size }, data{ new int[other.size] } {
        for (int i = 0; i < other.size; ++i) {
            data[i] = other.data[i];
        }
    }
    // copy assignment
    Array &operator=(const Array &other) {
        if (this != &other) {
            delete[] data;
            this->size = other.size;
            this->data = new int[other.size];
            for (int i = 0; i < other.size; ++i) {
                data[i] = other.data[i];
            }
        }
        return *this;
    }
    // destructor
    virtual ~Array() {
        delete[] data;
    }
    int operator[](size_t i) const {
        return data[i];
    }
    int &operator[](size_t i) {
        return data[i];
    }
    size_t getSize() const {
        return size;
    }
private:
    size_t size;
    int *data;
};

// prefix
Array &operator++(Array &array) {
    for (size_t i = 0; i < array.getSize(); ++i) {
        ++array[i];
    }
    return array;
}

// postfix
Array operator++(Array &array, int) {
    Array temp{ array };
    ++array;
    return temp;
}
// prefix
Array &operator--(Array &array) {
    for (size_t i = 0; i < array.getSize(); ++i) {
        --array[i];
    }
    return array;
}

// postfix
Array operator--(Array &array, int) {
    Array temp{ array };
    --array;
    return temp;
}

std::ostream &operator<<(ostream &out, const Array &array) {
    for (size_t i = 0; i < array.getSize(); ++i) {
        out << array[i] << " ";
    }
    return out;
}

std::istream &operator>>(istream &in, Array &array) {
    for (size_t i = 0; i < array.getSize(); ++i) {
        in >> array[i];
    }
    return in;
}

int main() {


    
    cout << c << std::endl;
   cout << c++ << std::endl;
    cout << c << std::endl;
    cout << ++c << std::endl;
    cout << c << std::endl;
    cout << c-- << std::endl;
    cout << c << std::endl;
    cout << --c << std::endl;


    return 0;
}

2 Востаннє редагувалося ch0r_t (21.11.2021 13:51:43)

Re: Створіть клас Масив із конструкторами, деструктором та перевантаженими

noname122 написав:

Добрий день,є ось таке завданнячко

А за умовами завдання та програма має компілюватися, чи то опційно?

error: ‘c’ was not declared in this scope
Подякували: koala1

3

Re: Створіть клас Масив із конструкторами, деструктором та перевантаженими

#include <iostream>
#include <ostream>
 
 
class Array {
public:
    explicit Array(const std::size_t size): size{size}, data{new int[size]} {}
    Array(const std::initializer_list<int> &list): size{list.size()}, data{new int[list.size()]} {
        std::copy(list.begin(), list.end(), data);
    }
    // rule of three:
    // copy constructor
    Array(const Array &other): size{other.size}, data{new int[other.size]} {
        std::copy(other.data, other.data + other.size, data);
    }
    // copy assignment
    Array &operator=(const Array &other) {
        if (this != &other) {
            delete[] data;
            this->size = other.size;
            this->data = new int[other.size];
            std::copy(other.data, other.data + other.size, data);
        }
        return *this;
    }
    // destructor
    virtual ~Array() {
        delete[] data;
    }
    int operator[](std::size_t i) const {
        return data[i];
    }
    int &operator[](std::size_t i) {
        return data[i];
    }
    std::size_t getSize() const {
        return size;
    }
private:
    std::size_t size;
    int *data;
};
 
// prefix
Array &operator++(Array &array) {
    for (std::size_t i = 0; i < array.getSize(); ++i) {
        ++array[i];
    }
    return array;
}
 
// postfix
Array operator++(Array &array, int) {
    Array temp{array};
    ++array;
    return temp;
}
// prefix
Array &operator--(Array &array) {
    for (std::size_t i = 0; i < array.getSize(); ++i) {
        --array[i];
    }
    return array;
}
 
// postfix
Array operator--(Array &array, int) {
    Array temp{array};
    --array;
    return temp;
}
 
std::ostream &operator<<(std::ostream &out, const Array &array) {
    for (std::size_t i = 0; i < array.getSize(); ++i) {
        out << array[i] << " ";
    }
    return out;
}
 
std::istream &operator>>(std::istream &in, Array &array) {
    for (std::size_t i = 0; i < array.getSize(); ++i) {
        in >> array[i];
    }
    return in;
}
 
int main() {
 
    Array c{1, 2, 3, 4, 5};
 
    std::cout << c << std::endl;
    std::cout << c++ << std::endl;
    std::cout << c << std::endl;
    std::cout << ++c << std::endl;
    std::cout << c << std::endl;
    std::cout << c-- << std::endl;
    std::cout << c << std::endl;
    std::cout << --c << std::endl;
 
 
    return 0;
}

Вибачте ось код

4

Re: Створіть клас Масив із конструкторами, деструктором та перевантаженими

А куди простіше? Більшість функцій - в 1-2 рядки. Можна оператори в клас внести (хоча код це не спростить, а лише зробить дещо логічнішим), ну і контейнером взяти не динамічний масив, а, скажімо, std::vector, це таки збереже пару-трійку рядків.
Ну з C++11 діє вже не "правило трійки", а "правило п'ятірки" (знову ж таки, вектор збереже нерви).
Так, сучасний C++ дещо багатослівний, і?

5

Re: Створіть клас Масив із конструкторами, деструктором та перевантаженими

Наприклад цю ж частину можно якось спростити

  explicit Array(const std::size_t size): size{size}, data{new int[size]} {}
    Array(const std::initializer_list<int> &list): size{list.size()}, data{new int[list.size()]} {
        std::copy(list.begin(), list.end(), data);

6

Re: Створіть клас Масив із конструкторами, деструктором та перевантаженими

noname122 написав:

Добрий день,є ось таке завданнячко:
Ось код ,а питання полягає в тому ,як можно "простіше написати цей код"

class Array {
public:
    explicit Array(const std::size_t size) : size{ size }, data{ new int[size] } {}
    Array(const Array &other) : size{ other.size }, data{ new int[other.size] } {
        for (int i = 0; i < other.size; ++i) {
            data[i] = other.data[i];
        }
    }
};

int main() {

    /* ... */

    return 0;
}

Використовувати готові контейнери для того щоб написати свій, цікава практика у навчанні. Викладач в мене такого коду не прийняв би і бігав би я за ним довго та нудно... Цікаво буде подивитись на зразок коду коли ви будете описувати ті самі списки чи вектори, про котрі згадував пан koala... )))

Подякували: ch0r_t1

7 Востаннє редагувалося wander (21.11.2021 14:06:39)

Re: Створіть клас Масив із конструкторами, деструктором та перевантаженими

Нічого особливого, написання власних контейнерів на базі стандартних - звичайна практика хорошого тону. Хоча тут, напевно, все таки дещо інше, завдання має на увазі опис власного примітиву динамічного масиву (аналога вектора), в принципі, це нормально. Ти не програміст, якщо жодного разу не писав свій вектор  :D

Подякували: lucas-kane1

8

Re: Створіть клас Масив із конструкторами, деструктором та перевантаженими

компілятор тут видає помилку

i

    Array c{ 1, 2, 3, 4, 5 };

9

Re: Створіть клас Масив із конструкторами, деструктором та перевантаженими

Тема закрита