C ++ выборочно перегружен []? - PullRequest
0 голосов
/ 30 марта 2012

Учитывая:

class example
{
    public:
        std::vector<std::vector<int>> a;
        int b;
}

func()
{
    example e;
    ... // populate e

Затем я мог бы использовать примеры членов, например, так.

    int n = e.b;
    int n2 = e.a[2][3];

Однако, я мог бы альтернативно переопределить оператор [] так, что.*

?

edit: Извините, пример теперь исправлен.

Ответы [ 2 ]

4 голосов
/ 30 марта 2012

Что вы можете сделать, это перегрузить оператор доступа и делегировать его вектору:

class example
{
    public:
        std::vector<std::vector<int>> a;
        int b;

        const std::vector<int>& operator[](std::size_t i) const
        {
            return a[i];
        }
        std::vector<int>& operator[](std::size_t i)
        {
            return a[i];
        }
};

Первый [] вернет ссылку на соответствующий элемент a, на которомвторой [] будет использоваться.

2 голосов
/ 30 марта 2012

Одним из наивных решений было бы определение собственного operator[]:

class example
{
    std::vector<std::vector<int>> v;
public:
    std::vector<int> const & operator[](std::size_t i) const { return v[i]; }
    std::vector<int>       & operator[](std::size_t i)       { return v[i]; }

    // ...
};

Теперь, если у вас есть example e;, тогда e[1] - это вектор целых чисел и т. Д.

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

class Matrix
{
    std::size_t cols;
    std::size_t rows;
    std::vector<int> v;

public:
    explicit Matrix(std::size_t r, std::size_t c) : cols(c), rows(r), v(r*c) { }

    int operator()(std::size_t i, std::size_t j) const { return v[i * cols + j]; }
    int & operator()(std::size_t i, std::size_t j) { return v[i * cols + j]; }
};

Теперь вы можете сказать: Matrix m(4, 7); m(1, 3) = 8;. Для этого необходимо использовать оператор круглых скобок, поскольку оператор квадратной скобки всегда должен принимать ровно один аргумент и поэтому здесь не подходит.

...