Как исправить перегрузку оператора скобки / индекса, если переменная, с которой вы работаете, является const? - PullRequest
0 голосов
/ 11 декабря 2011

У меня есть шаблон для трехмерного массива, однако у меня возникают проблемы при компиляции, когда переменная типа Chunk (см. Typedef ниже) пытается выполнить индексный доступ.

template <typename T, int xMax, int yMax, int zMax>
class Volume {
public:
    class HelperIndex3 {
    public:
        HelperIndex3(Volume& p, int xx, int yy) : parent(p), x(xx), y(yy) {}
        T operator[] (int z) const {return parent.data[x][y][z];}
        T& operator[] (int z) {return parent.data[x][y][z];}
    private:
        Volume& parent;
        int x;
        int y;
    };
    class HelperIndex2 {
    public:
        HelperIndex2(Volume& p, int xx) : parent(p), x(xx) {}
        HelperIndex3 operator[] (int y) const {return HelperIndex3(parent, x, y);}
        HelperIndex3 operator[] (int y) {return HelperIndex3(parent, x, y);}
    private:
        Volume& parent;
        int x;
    };
    HelperIndex2 operator[] (int x) const {return HelperIndex2(*this, x);} //problem at this line
    HelperIndex2 operator[] (int x) {return HelperIndex2(*this, x);}

private:
    T data[xMax][yMax][zMax];
};

typedef Volume<unsigned char, 64, 64, 64> Chunk;

Строка проблемы, кажется, хочет получить const Volume & p в конструкторе HelperIndex2, что, я думаю, имеет смысл, поскольку я пытаюсь использовать const Chunk в другом месте - но я не знаю, как это исправить,Если я добавлю второй конструктор, я должен поддерживать две родительские ссылки, одна из которых постоянна, а другая нет?Я боюсь, что это превратится в беспорядок.Если бы кто-то мог объяснить правильный способ решения этой ситуации, я был бы очень признателен.

1 Ответ

1 голос
/ 11 декабря 2011

Вы не сможете поддерживать два набора прокси-классов. Это полностью аналогично вложенным классам iterator и const_iterator стандартных контейнеров библиотеки.

Поскольку вы возвращаете копию прокси-класса, прокси-класс, который содержит изменяемую ссылку на исходный объект, не может также использоваться для постоянного доступа к исходному объекту, поэтому вы не можете обойти некоторые своего рода двоякий подход. Семантика этих двух вариантов различна: если все, что у вас есть, является экземпляром прокси-класса, у вас есть , чтобы иметь возможность узнать, разрешает ли он мутирующий или только доступ только для чтения.

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