0

我一直在想這件事,並沒有提出任何有用的東西。我有2個類表示的矩陣:重載二維數組運算符並拋出異常

class CMatrix { 
public: 
    CMatrixRow * matrix; 
    int height, width; 
    CMatrix(const int &height, const int &width); 
    CMatrix(const CMatrix &other); 
    ~CMatrix(); 
    CMatrixRow operator [] (const int &index) const; 
    ... 
} 

class CMatrixRow { 
public: 
    int width; 
    CMatrixRow(const int &width); 
    CMatrixRow(const CMatrixRow &other); 
    ~CMatrixRow(); 
    double operator [] (const int index) const; 
    void operator =(const CMatrixRow &other); 
private: 
    double * row; 

};

其中CMatrix是矩陣行(CMatrixRow)的容器。 當有人試圖訪問它的邊界之外的矩陣時,我需要拋出一個異常,換句話說,其中一個使用的索引大於矩陣的大小。問題是,我需要在第一個索引某種方式傳遞到方法

double operator [] (const int index) const; 

所以它可以拋出異常有關這兩個索引的信息,無論是哪其中之一是錯誤的。我也想盡可能保持簡單。你能想到什麼嗎?

+1

完全不同的東西,你的'CMATRIX ::運算符[]'可能毀了你的行,因爲你回來一個'CMatrixRow'的副本,稍後將調用'〜CMatrixRow'並可能刪除'row'。改爲返回對您的行的引用。此外,爲你的行使用'std :: vector'或類似的類,爲你隱藏所有的內存事物。其實,你可以在這種情況下使用'std :: vector :: at'作爲例外... – Zeta 2013-04-05 22:38:03

+0

好的一點,thanx – 2013-04-05 22:39:05

+0

這是一個學校作業,我禁止使用std :: vector – 2013-04-05 22:49:17

回答

1

您的CMatrixRow需要能夠找出它在您的容器中的哪一行。一個簡單的方法是給CMatrixRow的構造函數一個額外的參數,這個參數是它的行索引,它可以在創建之後保留下來。但是,這是一種冗餘形式,如果您開始移動CMatrixRow,可能會導致問題。

實現矩陣訪問是很常見的,operator()取兩個參數,而不是將此operator[]與輔助類關聯。所以,而不是matrix[i][j],你會做matrix(i, j)。這使您的問題更容易,並可能導致性能提高。有關更多信息,請參閱"Why shouldn't my Matrix class's interface look like an array-of-array?"

+0

這將有所幫助,但這是我的學校作業,它必須作爲二維數組 – 2013-04-05 22:47:32

+0

@MichalArtazov嗯,我已經給你一個簡單的方法來做到這一點 – 2013-04-05 22:48:15

+0

是的,但我的任務是使課堂和基本任務之一是實現[]重載... – 2013-04-05 22:51:29

0

Eventualy我設法做這樣

class CMatrix { 
public: 
    double ** matrix; 
    int height, width, throwFirstIndex; 

    class Proxy { 
    public: 
     Proxy(double * array, const int width, const int rowIndex, bool fail = false); 
     double & operator [] (const int &index) const; 
    private: 
     double * row; 
     int width, rowIndex; 
     bool fail; 
    }; 

    CMatrix(const int &height, const int &width); 
    CMatrix(const CMatrix &other); 
    ~CMatrix(); 
    Proxy operator [] (const int &index) const; 
    ... 
}; 

我basicaly複製這樣的:Operator[][] overload