У тебя хорошее начало.Несколько вещей, на которые нужно указать.
Присвоение запрашивает конструктор по умолчанию, НО также утверждает, что изменение размера массива не поддерживается.Эти два требования логически противоречат - ваше предположение (использовать size=0
) кажется логичным, но тогда этот построенный по умолчанию объект всегда будет пустым.Не большая проблема, просто логическое несоответствие в требованиях.
Параматизированный конструктор, принимающий верхнюю и нижнюю границы.Вы начали с этого как:
FlexArray(LI,UI); // POST: Parameterized Constructor
Однако, LI
и UI
потребуются типы.Поскольку вы должны поддерживать отрицательные индексы, это должен быть тип со знаком, например int
.
Конструктор копирования, это конструктор, который принимает объект того же типа.Вы не объявили один из них.Он должен иметь форму:
FlexArray(const FlexArray&);
Оператор присваивания - это оператор =
, который позволяет вам сделать это:
FlexArray a, b;
b = a;
Вы не объявили ни одного из них.Он должен иметь вид:
FlexArray& operator=(const FlexArray&);
Реализация будет аналогична конструктору копирования (фактически конструктор копирования может быть просто реализован в терминах оператора присваивания).
Перегруженный []
оператор.Вы объявили один из них, но на самом деле он не в правильной форме - не принимает соответствующие типы аргументов.Использование будет выглядеть следующим образом:
FlexArray arr(-5, 10);
// This is a call to operator[]
arr[3] = value;
Учитывая это, попробуйте подумать о том, какой тип аргумента он должен принимать.
Теперь перейдем к функциональным требованиям.Учитывая верхнюю и нижнюю границы, вы должны создать массив, который можно индексировать, используя эти границы.Подумайте, что вам нужно знать, чтобы сделать это.Я предложу вам узнать разницу между верхней и нижней границами (это будет РАЗМЕР вашего массива).Вы должны проверить в конструкторе, что верхняя граница больше, чем нижняя граница, или вы не можете эффективно создать этот массив.
Теперь, чтобы фактически построить ваш массив объектов, вам нужно будет динамически распределять некоторую память дляих.Вы можете попробовать это с:
T FlexArray[size]; // Flex array
Но с этим есть некоторые проблемы.Во-первых, я не думаю, что вы можете назвать это FlexArray
, поскольку это будет совпадать с именем вашего класса.Во-вторых, для этого требуется, чтобы size
была постоянной времени компиляции, что противоречит нашим требованиям.Итак, вам нужно будет динамически распределять внутренний массив из T
объектов (используя new
, если вы еще не узнали об умных указателях).Не забудьте освободить этот массив объектов в вашем деструкторе.
Теперь функционально, как будет работать []
?Требуется выполнить проверку границ, поэтому, учитывая индекс, вы должны знать, является ли он слишком низким (за пределами нижней границы) или слишком высоким (за пределами верхней границы), и вызвать соответствующую ошибку.Теперь у вас есть динамически размещенный (основанный на 0) массив из T
объектов - с учетом индекса, указанного пользователем, вам нужно найти соответствующий объект для возврата.Подумайте, как это сделать.
Кроме того, вы объявили +
и -
операторов, хотя в требовании не указано, какие они должны быть.Я бы предложил вынуть их.Оператор +
подразумевает, что размер массива будет изменен (что противоречит требованиям), а -
неоднозначен, что означает вычитать два массива?Обе эти функции могут быть действительными, но для этого назначения нет необходимости.
Нет больше подсказок:)