Перегрузка одновременности двух операторов в c

#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, проверка границ отсутствует.

РЕДАКТИРОВАТЬ: похоже, Гривс отредактировал свое решение.