Если в класс завёрнут динамический массив, то не следует возвращать просто ссылку на элемент, так как:
1. Она может быть присвоена переменной-ссылке (
).
2. Её адрес может быть присвоен переменной-указателю (
.
и после этого может быть изменён размер массива, в результате чего может:
1. Измениться фактическое размещение элементов.
2. Количество элементов может стать меньше или равно индексу, после чего элемент с таким индексом может перестать существовать.
Вместо этого следует написать вспомогательный private-класс-член, конструктор которого будет принимать ссылку на базовый тип массива и присваивать адрес этого параметра private-указателю-члену, типом которого должен быть указатель на базовый тип пассива. Этот вспомогательный класс должен иметь оператор-член привидения к базовому типу массива и оператор присваивания константной ссылки на базовый тип массива. Вот объект этого класса и должен возвращать оператор квадратные скобки: оператор квадратные скобки можно будет применять в качестве и правого, и левого оператор присваивания, но нельзя будет взять адрес возвращаемого им значения:
Код: Выделить всё
class TIntArray
{
private:
int *Data;
class IntProperty
{
private:
int *Point;
public:
IntProperty (int &n)
{
Point=&n;
}
operator int ()
{
return *Point;
}
IntProperty operator = (const int &x)
{
*Point=x;
}
};
public:
IntProperty operator [] (size_t i)
{
...
return IntProperty(Data[i]);
}
...
};
. Здесь условно не показаны конструкторы и деструкторы класса TIntArray, копирование и присваивание его экземпляров, проверка индекса и функции, меняющие, или возвращающие количество элементов. Не пытайтесь закрыть или удалить конструктор копий вспомогательного класса, даже если оператор квадратные скобки возвращает ссылку на экземпляр вспомогательного класса: не скомпилируется.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.