Допустим есть у меня свой класс контейнер (пускай с int'ами) с перегруженным оператором индексирования.
Мне нужно чтобы при выходе индекса за границы возвращался нуль, &operator[] значение возвращать не будет, т. к. возвращает ссылку, могу использовать operator[] но тогда его возможно использовать только справа от оператора присваивания, и так и так кривое решение получается.
Visual studio 2008:
T &operator[](int x){
if ((x > N-1)||(x <0)){
exit()
}
return c[x];
}
в результате завершает программу. Если же "return c[x]" засунуть в условие соблюдения границ то возвращать ссылку будет вне зависимости входит в границы или нет, что я понять уже не способен.
Другие языки программирования и технологии
operator[]
> Мне нужно чтобы при выходе индекса за границы возвращался нуль
А зачем?
> тогда его возможно использовать только справа от оператора присваивания
А что вы предлагаете делать, когда присваивание будет к несуществующему элементу контейнера? Можно бросать исключение, а можно ничего не делать.
Здесь с исключением:
#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; // ВЫБРОС ИСКЛЮЧЕНИЯ, ТАКОГО ИНДЕКСА НЕТ, ПРИСВАИВАНИЕ НЕВОЗМОЖНО
}
А зачем?
> тогда его возможно использовать только справа от оператора присваивания
А что вы предлагаете делать, когда присваивание будет к несуществующему элементу контейнера? Можно бросать исключение, а можно ничего не делать.
Здесь с исключением:
#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; // ВЫБРОС ИСКЛЮЧЕНИЯ, ТАКОГО ИНДЕКСА НЕТ, ПРИСВАИВАНИЕ НЕВОЗМОЖНО
}
T &operator[](int x){
T *t = 0;
return t;//вернёт нуль
}
а лучше всего - исключения использовать.
T *t = 0;
return t;//вернёт нуль
}
а лучше всего - исключения использовать.
Похожие вопросы
- С++. operator Для чего нужны operator++, operator<<, operator* и т. д. Как их использовать?
- Как читается песня по русски Sade “Smooth operator”?
- Как работает operator+ в C++?
- Как перевести фразу "smooth operator" ??
- Kona Operator 2013/Entourage 2013 Что лучше брать для экстримального катания в условиях города (дропы, лестницы)?