2017-11-03 9 views
-5

나는 연산자 오버로딩을 사용하여 행렬을 더하는 프로그램을 만들었습니다. 프로그램을 만들었지 만 행렬 B에 대한 입력을받지 않습니다. 프로그램과 도움을보십시오. 이 행렬 입력은 noramlly 두 개의 다른 객체로 메인에서 가져온 다음, '+'연산자를 오버로드하여 2 개의 객체 멤버를 추가하고 '< <'연산자가 오버로드되었음을 나타내는 열도 사용했습니다.연산자 오버로딩을 사용한 행렬 덧셈

#include<iostream> 
    using namespace std; 
    int s; 
    class matrix 
    { 
    public: 
     int **m1,**m; 
     friend matrix operator +(matrix &t,matrix &t1); 
     friend ostream& operator << (ostream &out,matrix &t); 
    }; 
    matrix operator +(matrix &t,matrix &t1) 
    { 
     for(int x=0;x<s;x++) 
     { 
      for(int y=0;y<s;y++) 
      { 
       t.m1[x][y]+=t1.m1[x][y]; 
      } 
     } 
    } 
    ostream& operator << (ostream &out,matrix &t2) 
    { 
     for(int p=0;p<s;p++) 
     { 
      for(int q=0;q<s;q++) 
      { 
       out<<t2.m[p][q]<<" "; 
      }   
      out<<endl; 
     } 
    } 
    int main() 
    { 
     cout<<"Enter the size of matrices(SQUARE MAT ONLY):: "; 
     cin>>s; 
     matrix t,t1,t2; 
     for(int i=0;i<s;i++) 
     { 
      for(int j=0;j<s;j++) 
      { 
       cout<<"Enter value ("<<i+1<<","<<j+1<<") for matrix A::"; 
       cin>>t.m1[i][j]; 
      } 
     } 
     for(int i=0;i<s;i++) 
     { 
      for(int j=0;j<s;j++) 
      { 
       cout<<"Enter value ("<<i+1<<","<<j+1<<") for matrix B::"; 
       cin>>t1.m1[i][j]; 
      } 
     } 
     t2=t+t1; 
     cout<<t2; 
    } 
+1

매트릭스 구성 요소의 내부 표현을위한 메모리는 어디에서 구합니까? – Jodocus

+4

왜'std :: vector'를 사용하지 않습니까? '**'는 아스키 예술에 좋지만, 좋은 코드가 아닙니다. – user463035818

+0

또는 표준 행렬 대수 라이브러리. [Eigen] (예 : http://eigen.tuxfamily.org/index.php?title=Main_Page). – Thomas

답변

0

정사각형 행렬에 대한 클래스를 만들고 두 개의 정방 행렬을 추가한다고 가정합니다. 클래스 표현과 일부 코드를 수정하고 다음과 같은 가능한 해결책을 제시했습니다.

#include<iostream> 
using namespace std; 
#define s 3 //this is just an example value of s. This should generally be a defined as all caps. Eg: #define MATRIX_SIZE 3 
class matrix 
{ 
     public: 
     int **m; 
     matrix() 
     { 
      m = new int*[s]; 
      for(int i = 0 ; i < s ; i++) 
      { 
       m[i] = new int[s]; 
      } 
     } 
     friend matrix operator +(matrix &m1, matrix &m2); 
     friend ostream& operator << (ostream &os, matrix &m1); 

}; 

matrix operator +(matrix &m1, matrix &m2) 
{ 
    matrix m3 = matrix(); 


    for(int i = 0 ;i < s ; i++) 
    { 
     for(int j = 0 ; j < s ; j++) 
     m3.m[i][j] = m1.m[i][j] + m2.m[i][j]; 


    } 
    return m3; 
} 

ostream& operator <<(ostream &os, matrix& m) 

{ 
    for(int i = 0 ; i< s ; i++) 
    { 
     for(int j = 0 ; j < s ; j++) 
     os << m.m[i][j] <<" "; 
     os << "\n"; 
    } 
    return os; 
} 

int main() 
{ 
    matrix m1 = matrix(); 
    matrix m2 = matrix(); 
    for(int i = 0 ; i < s ; i++) 
    { 
    for(int j = 0 ;j < s ; j++) 
    { 
     m1.m[i][j] = i+j; 
     m2.m[i][j] = i+j; 
    } 

    } 
    matrix m3 = m1 + m2; 
    cout << m3; 
    return 0; 
} 
+0

program을 주셔서 감사합니다. 큰 도움 .. – user8435633

+0

'matrix &'매개 변수'const matrix &'를 만들기위한 전술적 이점이 있습니다. '#define MATRIX_SIZE 3'은'const size_t MATRIX_SIZE = 3;'보다 안전합니다. #define은 텍스트를 대체하지 않으므로 프로그램에서 지옥을 파괴 할 수 있습니다. '#define s 3'은 https://ideone.com/puMIYY와 같은 이상한 종류의 위대한 데모를 만듭니다. 오류 메시지는 예전보다 훨씬 좋았습니다. – user4581301

+0

예 함수가 함수 매개 변수를 조작하지 않는 상황에서 & const 매트릭스를 사용하는 것에 동의합니다. –

2

구현 한 내용은 += 연산자와 비슷합니다. 그것은 t을 제자리에서 수정하고 서명에도 불구하고 아무 것도 반환하지 않습니다 (컴파일러의 경고를 듣고주의하십시오!). 이것은 정의되지 않은 동작입니다.

간단히 말해서 + 연산자는 새 행렬 객체를 만들어 반환해야합니다.

+0

나는 또한 이것을 시도했다 ... "t3.m1 [i] [j] = t.m1 [i] [j] + t1.m1 [i] [j]" "return (t3.m1 [i] [j])". 그리고 컴파일러는 오류나 경고를 표시하지 않습니다. 가능하다면 코드를 편집하고 돌려 줄 수 있습니까? 부디!! – user8435633