2016-12-11 5 views
1

は、私は、過負荷をオペレーターに新しいです となりましオペレータ[] []オーバーロードを使用して 行列を初期化しようとしています。演算子のオーバーロード行列C++ **プロキシなし**

お困り 行列を次のように初期化したいと考えています: 行列[0] [0] = 100

[] []を使うことはできますか?どのように私はそれらを使用するのですか?

//main.cpp// 
void main() 
    { 
     Matrix m(2, 2); 
     m[0][0] = 2; 
    } 


//matrix.h// 
#ifndef MATRIX_H 
#define MATRIX_H 


class Matrix 
{ 
public : 
    Matrix(int ,int); 
    Matrix operator [][] // *****im stuck here***** 


private : 
    int numRows; 
    int numCols; 
    int **matrix; 
} 
#endif 


//matrix.cpp// 

#include <iostream> 
#include "Matrix.h" 
using namespace std; 


Matrix::Matrix(int rows,int cols) 
    :numOfCols(cols),numOfRows (rows) 
{ 
    matrix=new int *[cols]; 
    for(int i=0;i<rows;i++) 
    { 
     matrix[i]=new int [cols]; 
     for(int c=0;c<cols;c++) 
     { 
      matrix[i][c]=0; 
     } 


    } 
} 
+0

このコードをすべて書き込むのではなく、単に 'std :: array 、rowCount> '?それでも 'foo [y] [x]'構文が得られます。 –

+0

@Jackは、値のギャップのない配列が必要な場合、悪い考えをしています。どこか別の場所で使う。パフォーマンスPOVからの悪い考え。それはそれをカットしない教育訓練です。 – Swift

答えて

1

これを行うにはいくつかの方法がありますが、前に準備したものがあります。プロキシクラスを使用して行を表します。具体的には演奏されず、コピー/割り当て/移動などは実装されません。

#include <iostream> 
using namespace std; 


class Mat2 { 

    public: 

     Mat2(unsigned int x, unsigned int y) : 
      mX(x), mY(y), mData(new int[x * y]) {} 

     ~Mat2() { 
      delete [] mData; 
     } 


     int & At(unsigned int x ,unsigned int y) { 
      return mData[ x * mY + y ]; 
     } 

     class XProxy { 
      public: 
       XProxy(unsigned int x, Mat2 * mat) :mX(x), mMat(mat) {} 
       int & operator[](unsigned int y) { 
        return mMat->At(mX, y); 
       } 
      private: 
       unsigned int mX; 
       Mat2 * mMat; 
     }; 


     XProxy operator[](unsigned int x) { 
      return XProxy(x, this); 
     } 

    private: 

     unsigned int mX, mY; 
     int * mData; 

}; 

int main() { 
    Mat2 m(4,6); 
    m[1][3] = 42; 
    cout << m.At(1, 3) << endl; 
} 
関連する問題