НЧ
Николай Чуланов

operator[]

Допустим есть у меня свой класс контейнер (пускай с int'ами) с перегруженным оператором индексирования.

Мне нужно чтобы при выходе индекса за границы возвращался нуль, &operator[] значение возвращать не будет, т. к. возвращает ссылку, могу использовать operator[] но тогда его возможно использовать только справа от оператора присваивания, и так и так кривое решение получается.

Visual studio 2008:

T &operator[](int x){

if ((x > N-1)||(x <0)){

exit()

}

return c[x];

}

в результате завершает программу. Если же "return c[x]" засунуть в условие соблюдения границ то возвращать ссылку будет вне зависимости входит в границы или нет, что я понять уже не способен.

Олеся
Олеся

> Мне нужно чтобы при выходе индекса за границы возвращался нуль
А зачем?

> тогда его возможно использовать только справа от оператора присваивания
А что вы предлагаете делать, когда присваивание будет к несуществующему элементу контейнера? Можно бросать исключение, а можно ничего не делать.

Здесь с исключением:

#include

class neh_excp {
public:
neh_excp(int _i) { std::cout << _i << " - неверный индекс для присваивания" << std::endl; }
};

template
class neh {
T *a;
int n;
T at(int _i) { return _i >= n || _i < 0? 0 : a[_i]; }
void at(int _i, const T &v) {
if (_i < 0 || _i >= n) throw neh_excp(_i); // УБРАТЬ ЭТУ СТРОКУ, ЕСЛИ НЕ НУЖНО ИСКЛЮЧЕНИЕ!
a[_i] = v;
}
class proxy {
neh &t;
int i;
public:
proxy(neh &t, int i): t(t), i(i) {}
operator T() { return t.at(i); }
proxy &operator=(const T &v) {
t.at(i, v);
return *this;
}
};
public:
neh(int n, int v): n(n), a(new T[n]) { for (int _i = 0; _i < n; ++_i) a[_i] = v; }
~neh() { delete[] a; }
proxy operator[](int i) { return proxy(*this, i); }
};

int main() {
neh v(3, 123);
for (int c = -1; c < 4; ++c) std::cout << "v[" << c << "]: " << v[c] << std::endl;
std::cout << std::endl;

v[1] = 321; // все OK, присваивание работает
for (int c = -1; c < 4; ++c) std::cout << "v[" << c << "]: " << v[c] << std::endl;
std::cout << std::endl;

// v[3] = 321; // ВЫБРОС ИСКЛЮЧЕНИЯ, ТАКОГО ИНДЕКСА НЕТ, ПРИСВАИВАНИЕ НЕВОЗМОЖНО
}

Се
Сергей

T &operator[](int x){

T *t = 0;
return t;//вернёт нуль

}

а лучше всего - исключения использовать.

Похожие вопросы
nod32 говорит что на моем сайте вирус
Что такое программная инженерия и компьютерная инженерия? Чем они отличаються?
pozvonil segodnya nomer +749610*** kakoi eto region, i kakoi operator?
C# : operator using and IDisposable
Ошибка missing operator or semicolon на Delphi
Объясните что делает эта строка int & operator [] (int index); на С++ и зачем она?
как должен выглядеть прототип дружественной функции шаблонного класса? friend istream& operator>>
Посоветуйте песню похожую настроением на песню Sade- Smooth Operator
я перевожу деньги с телефона на вебмани и мне выходит такая надбись что делать? Operator 7926*** not supported [4]
Хочу создать себе страницу operator@snd.ru как это сделать