2016-12-11 7 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 네가 gapless 값의 배열을 필요로한다면 나쁜 아이디어 일 것이다. 다른 곳에서 사용할 수 있습니다. 성능 POV에서 나쁜 아이디어. 그리고 그것은 교육 운동입니다 - 그것을 자르지 않을 것입니다. – Swift

답변

1

여기에는 행을 표시하는 데 프록시 클래스를 사용하는 여러 가지 방법이 있습니다. 특히 performant는 아니며 복사/할당/이동 등을 구현하지 않습니다.

#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; 
}