Абстрактный тип данных (класс вектор с указателем на 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 шт):
Вам не хочется в конструкторе
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;
}
}
??
