Абстрактный тип данных (класс вектор с указателем на int) в C++

Всем привет! Написал программу на C++. Сначала выводятся пустые квадратные скобки, далее при попытке создать новый элемент выводится сообщение о выходе за пределы индекса. Что может быть не так в этой программе?

Задача была такая:

Создать абстрактный тип данных - класс вектор, который имеет указатель на int, число элементов и переменную состояния. Определить конструктор без параметров, конструктор с параметром, конструктор с двумя параметрами. Конструктор без параметров выделяет место для одного элемента и инициализирует его в ноль. Конструктор с одним параметром, - размер вектора, - выделяет место и инициализирует номером в массиве, конструктор с двумя параметрами выделяет место (первый аргумент) и инициализирует вторым аргументом. Деструктор освобождает память. Определить функцию, которая присваивает элементу массива некоторое значение (параметр по умолчанию), функцию которая получает некоторый элемент массива. В переменную состояния устанавливать код ошибки, когда не хватает памяти, выходит за пределы массива. Определить функцию печати. Пока это только часть текста задания.

Мой код:

#include <iostream>
#include <stdexcept>
using namespace std;

class VectorOfInt {
    private:
        size_t size;
        int *data;
    
    public:
        // Конструктор
        VectorOfInt();
        
        // Конструктор
        VectorOfInt(size_t);
        
        // Копирующий конструктор
        VectorOfInt(const VectorOfInt &);
        
        // Деструктор
        ~VectorOfInt();
        
        // Функция, присваивающая элементу массива значение
        void setValue(size_t);
        
        // Функция, присваивающая элементу массива значение
        void setValue(size_t, int);
        
        // Функция, получающая некоторый элемент массива
        const int getValue(size_t index) const;
        
        // Функция, возвращающая размер созданного вектора
        size_t getSize() const;
};

// Конструктор
VectorOfInt::VectorOfInt() {
    size = 1;
    data = new int[size];
}

VectorOfInt::VectorOfInt(size_t size) {
    data = new int[size];
    for (size_t i = 0; i < size; ++i) {
        data[i] = i;
    }
}

// Копирующий конструктор
VectorOfInt::VectorOfInt(const VectorOfInt &other) {
    data = new int[size = other.size];
    for (size_t i = 0; i < size; i++)
        data[i] = other.data[i];
}

// Деструктор
VectorOfInt::~VectorOfInt() {
    delete[] data;
}

// Функция, присваивающая элементу массива значение
void VectorOfInt::setValue(size_t index) {
    if (index >= size)
        throw out_of_range("index went out of range");
    data[index] = 0;
}

// Функция, присваивающая элементу массива значение
void VectorOfInt::setValue(size_t index, int value) {
    if (index >= size)
        throw out_of_range("index went out of range");
    data[index] = value;
}

// Функция, получающая некоторый элемент массива
const int VectorOfInt::getValue(size_t index) const {
    if (index >= size)
        throw out_of_range("index went out of range");
    return data[index];
}

// Функция печати
ostream &operator << (ostream &stream, const VectorOfInt &v) {
    stream << "[";
    for (size_t i = 0; i < v.getSize(); ++i) {
        stream << v.getValue(i);
        if (i < v.getSize() - 1)
            stream << ", ";
    }
    return stream << "]";
}

// Функция, возвращающая размер созданного вектора
size_t VectorOfInt::getSize() const {
    return size;
}

int main() {
    VectorOfInt v(10);
    cout << v << endl;
    
    v.setValue(9);
    cout << v << endl;
    
    v.setValue(3, 4);
    cout << v << endl;

    return 0;
}

Что выводит программа:

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Harry

Вам не хочется в конструкторе

VectorOfInt::VectorOfInt(size_t size) {
    data = new int[size];
    for (size_t i = 0; i < size; ++i) {
        data[i] = i;
    }
}

сохранить передаваемый размер во внутреннем поле? Типа,

VectorOfInt::VectorOfInt(size_t size): size(size) {
    data = new int[size];
    for (size_t i = 0; i < size; ++i) {
        data[i] = i;
    }
}

??

→ Ссылка