2014-09-24 44 views
0

快速的問題,我看到當我谷歌這個話題唯一的事情是人們說,使用代理是要走的路。爲什麼返回一個指針不可行?多維下標,爲什麼在指針上使用代理?

例子!

class example{ 
private: 

int** arr; 

public: 
    int* operator[](const int index) { 
     return arr[index]; 
    } 
}; 

我們剛剛打過電話

cout << example[0][0]; 
5 

,並在陣列中的工作,我爲什麼要經歷的麻煩創建一個代理類和調用proxys運營商[],以達到一個更「深入」 ?

+0

那麼,爲什麼你首先需要一個類而不是'int **'? 'example [0] [0]'也可以用於'int **'。 – iavr 2014-09-24 19:58:16

+1

通常代理是「需要」的,因爲數據不能通過指向指針的指針訪問。但大多數時候你不需要'[x] [y]'訪問。 – juanchopanza 2014-09-24 19:58:27

+0

該類是一個矩陣類,可以執行矩陣乘法,旋轉投影等等......我剛剛創建了這個示例類! – 2014-09-24 20:07:17

回答

0

我通常會爲第二個下標或者像某些人在評論中建議的那樣,爲類寫一個代理,這對於更多的事情而不是下標有用。

也就是說,我喜歡這種代理方法,因爲它可以重現經典的二維數組或指針到指針下標sintaxes。但他們是最好的(可讀,簡單,高效)替代?我不確定。

還有一個更簡單的選擇:超載operator()爲n維下標

class matrix 
{ 
public: 
    int operator()(std::size_t row , std::size_t column) const 
    { 
     return _matrix[row][column]; 
    } 
}; 

這是一個非常著名的技術也被許多代數庫。對於完全通用的(n維)庫,我認爲它比一系列代理和[][][][][]...更合適。另外使用可變模板更容易編寫一個真正的n維通用下標運算符。

+0

我同意'operator()'更容易。另外,考慮'operator []'和一個元組。 – 2014-09-24 22:09:14