Другие языки программирования и технологии

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 <iostream>

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

template <typename T>
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> &t;
int i;
public:
proxy(neh<T> &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<int> 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; // ВЫБРОС ИСКЛЮЧЕНИЯ, ТАКОГО ИНДЕКСА НЕТ, ПРИСВАИВАНИЕ НЕВОЗМОЖНО
}
МШ
Максим Швайбович
65 785
Лучший ответ
T &operator[](int x){

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

}

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