-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

我在代碼中看不到任何'[]'... – 2012-03-29 20:53:41

+1

您需要重載的地方在哪裏?我沒有看到任何'[]'需要。 – Hauleth 2012-03-29 20:54:06

+0

最後一塊應該是不同的? – 2012-03-29 20:54:48

回答

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的各個元素的引用,在其第二[]將使用。

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;。您必須使用圓括號運算符,因爲方括號運算符必須始終採用一個參數,因此在此不適用。