#c #operator-overloading
#c #перегрузка оператора
Вопрос:
Я хочу представить свой объект как массив. Я имею в виду, что программист может написать в своем коде
myobject[3]=2
На обратной стороне (в коде myobject) вообще нет массива, это только представление.
Поэтому мне нужно перегрузить []
и =
одновременно. Как это можно сделать?
спасибо и извините за мой плохой английский.
Комментарии:
1. Немного подробнее о том, что хранит ваш объект и как значения индекса имеют смысл. Это просто x, y, z? Вы создаете значение для индекса ПРИ обращении к индексу?
2. Я использую vector в качестве частного члена. Я использую vector, потому что я не знаю размер массива при программировании. Но я хочу предоставить доступ к каждому элементу в векторе. Невозможно указать адрес одного члена vector,
3. Да, вы предоставляете доступ к любому элементу в векторе. Проверьте мой ответ.
Ответ №1:
operator[]
должна возвращать ссылку на объект, который вы пытаетесь изменить. Это может быть какой-то метаобъект, который перегружается operator=
, чтобы делать все, что вы пожелаете, с вашим основным объектом.
Редактировать: поскольку OP прояснил проблему, есть способ сделать это. Посмотрите здесь:
#include <vector>
#include <iostream>
int amp; func(std::vector<int> amp; a)
{
return a[3];
}
int main()
{
std::vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
func(a) = 111;
std::cout << a[3] << std::endl;
}
Комментарии:
1. Ха, я, должно быть, уже спал. конечно, вы правы, IDK, почему я это пропустил…
2. Спасибо, Гривс. Извините, но я не понимаю, как это отвечает на мой вопрос. Я спросил об общем объекте, который перегружается
[]
, и вы ответили, что векторный объект имеет[]
. Я хочу использовать свой объект, а не вектор.3. Да, но я показал вам, что если ваш
operator[]
, возвращающийсяint amp;
, вернетсяvector[i]
, тогда он будет работать. И я действительно не понимаю, почему, приняв ответ, говорящий то же самое, что и мой (когда я предлагаю вам способ понять код, а не только скопировать его, не нападая ни на кого), вы спрашиваете меня, как это отвечает на мой вопрос? . Он отвечает так же, как и принятый.4. Спасибо, Гривс. Вы правы, это было мое непонимание, и я это исправлю.
5. @Griwes: Извините, я не нападал на вас. У вашего кода, перед редактированием, был серьезный недостаток в том, что вы использовали
return a.begin() 3
. Это не выполняло проверку границ и, следовательно, приводило к сбою, если пользователь запрашивал, например, индекс 5. Я просто сообщал оператору, что было не так. Я отредактировал свой ответ, как только увидел, что вы внесли изменения.
Ответ №2:
Поэтому мне нужно перегрузить [] и = одновременность. Как это можно сделать?
Это невозможно сделать. Вместо этого вы можете переопределить operator[]
, чтобы вернуть «ссылку на прокси». То есть объект, который знает об объекте ‘myobject’, к которому он был применен, и используемом индексе ‘3’, и предоставляет подходящие операторы преобразования для отображаемого типа (я нажимаю int
), а также операторы присваивания. В самой стандартной библиотеке есть несколько примеров ссылок на прокси. Что-то в строках:
class proxy
{
public:
proxy( objectamp; object, int index ) : _object( object ), _index( index ) {}
operator int() const { return _object.implementation.value_at( index ); }
proxy operator=( int value ){ _object.implementation.value_at( index, value ); return *this; }
private:
objectamp; _object;
int _index;
};
Ответ №3:
@yoni: можно указать адрес любого члена вектора (пока он существует). Вот как это делается.
intamp; MyObject::operator[](size_t index)
{
return mVector[index];
}
const intamp; MyObject::operator[](size_t index) const
{
return mVector[index];
}
Это возможно, потому что std::vector гарантированно хранит элементы в непрерывном массиве. Оператор[] std::vector возвращает ссылочный тип значения, которое он хранит. При перегрузке operator[] вам просто нужно передать эту ссылку из вашей функции operator[] .
ПРИМЕЧАНИЕ: std::vector позаботится о проверке границ. С решением, которое дает @Griwes, проверка границ отсутствует.
РЕДАКТИРОВАТЬ: похоже, Гривс отредактировал свое решение.