Перегрузка одновременности двух операторов в c ++ - PullRequest
5 голосов
/ 02 октября 2011

Я хочу представить свой объект как массив. Я имею в виду, что программист может написать в своем коде

myobject[3]=2

В конце (в коде myobject) вообще нет массива, это только представление.

Так что мне нужно перегрузить [] и = одновременно. Как это можно сделать?

спасибо, и извините за мой плохой английский.

Ответы [ 3 ]

7 голосов
/ 02 октября 2011

operator[] должен возвращать ссылку на объект, который вы пытаетесь изменить. Это может быть какой-то метаобъект, который перегружает operator=, чтобы делать с вашим основным объектом все, что вы пожелаете.

Редактировать : Как ОП выяснил проблему, есть способ сделать это. Смотрите здесь:

#include <vector>
#include <iostream>

int & func(std::vector<int> & 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;
}
4 голосов
/ 02 октября 2011

Так что мне нужно перегрузить [] и = одновременность.Как это можно сделать?

Это невозможно сделать.Вместо этого вы можете переопределить operator[] для возврата «ссылки на прокси».То есть объект, который знает объект «myobject», к которому он был применен, и индекс, использованный «3», и предоставляет подходящие операторы преобразования для сопоставленного типа (я нажимаю int), а также операторы присваивания.В самой стандартной библиотеке есть несколько примеров ссылок на прокси.Что-то в строках:

class proxy
{
public:
    proxy( object& 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:
    object& _object;
    int _index;
};
2 голосов
/ 03 октября 2011

@ yoni: можно указать адрес любого члена вектора (если он существует). Вот как это делается.

int& MyObject::operator[](size_t index)
{
    return mVector[index];
}
const int& MyObject::operator[](size_t index) const
{
    return mVector[index];
}

Это возможно, потому что std :: vector гарантированно хранит элементы в непрерывном массиве. Оператор [] из std :: vector возвращает ссылочный тип значения, которое он хранит. Если вы перегружаете оператор [], вам просто нужно передать эту ссылку из вашей функции operator [].

ПРИМЕЧАНИЕ: std :: vector позаботится о проверке границ. С решением, которое дает @Griwes, нет проверки границ.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...