-1

Дано:C++ выборочная перегрузка []?

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]; 

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

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

?

Редактировать: К сожалению, пример теперь исправлен.

+2

Я не вижу никаких '[]' в вашем коде ... –

+1

Где ваша перегрузка? Я не вижу никакого '[]' нуждающегося. – Hauleth

+0

Был ли какой-то последний блок каким-то образом отличаться? –

ответ

4

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

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 «s, на котором будет использоваться второй [] ,

2

Один наивный решение было бы определить свой собственный 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;. Для этого вам нужно использовать оператор круглой скобки, так как оператор квадратной скобки должен всегда принимать точно один аргумент и, следовательно, здесь не подходит.

Смежные вопросы