#cpp #массивы #классы #cpp11 #перегрузка_операторов
Реализовать перегрузку оператора [] для класса массив не составляет труда,если нужно элемент массива просто получить, а как реализовать перегрузку оператора [] для реализации вида: intArray a(5); a[0]=5; a[1]=10; // и т.д. Буду благодарна за ответ или ссылку на ответ.
Ответы
Ответ 1
Если есть класс и нужно перегрузить оператор [] для элементов класса имеющих тип T, то оператор перегружается обычно следующим образом T & operator []( size_t ); и const T & operator []( size_t ) const; Первый оператор позволяет изменять переданный по ссылке элемент класса, а второй позволяет работать с константными объектами. Обратите внимание, что следует одновременно определить оба этих оператора в классе. Для скалярных типов, когда копирование объектов является простой операцией, то можно второй оператор также определить как T operator []( size_t ) const; То есть он будет возвращать временный объект. Как я понимаю, для вашего случая типом T будет служить тип int. Также вы можете перегрузить оператор, когда параметром является список инициализации. Ниже показана демонстрационная программа. #include#include #include class Array { public: Array() : n(0), a(nullptr) {} explicit Array(size_t n) : n(n), a(nullptr) { if (n) a = new int[n](); } Array(size_t n, int value ) : n(n), a(nullptr) { if (n) { a = new int[n]; std::fill(a, a + n, value); } } Array(const Array &a) : n(0), a(nullptr) { if (a.n) { this->a = new int[a.n]; this->n = a.n; std::copy(a.begin(), a.end(), this->begin()); } } ~Array() { delete a; } size_t size() const { return n; } const int & operator [](size_t i) const { return a[i]; } int & operator [](size_t i) { return a[i]; } Array operator [](std::initializer_list lst) const { Array a(lst.size()); size_t i = 0; for ( size_t j : lst ) { a.a[i++] = this->a[j]; } return a; } int * begin() { return a; } const int * begin() const { return a; } int * end() { return a + n; } const int * end() const { return a + n; } private: size_t n; int *a; }; int main() { const int N = 10; Array a(N); int i = N; for (auto &x : a) x = --i; for (auto x : a) std::cout << x << ' '; std::cout << std::endl; Array b = a[{ 0, 2, 4, 6, 8}]; for (auto x : b) std::cout << x << ' '; std::cout << std::endl; } Вывод программы на консоль 9 8 7 6 5 4 3 2 1 0 9 7 5 3 1 В этом примере определены три оператора operator [] const int & operator [](size_t i) const; int & operator [](size_t i); Array operator [](std::initializer_list lst) const; Я класс определил по минимуму. Например, в нем отсутствует копирующий оператор присваивания. Вы можете самостоятельно его написать. Чтобы код компилировался в MS Visual Studio, вам необходимо включить макрообъявление в заголовочный файл следующим образом #pragma once #define _CRT_SECURE_NO_WARNINGS //... Ответ 2
Если для получения вы определяете оператор как int operator[](size_t index); то для того, чтобы и получать значение, и присваивать, его нужно определить как ссылку: int& operator[](size_t index);
Комментариев нет:
Отправить комментарий