| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 905 人关注过本帖
标题:求助(关于运算符重载的一个c++程序)
只看楼主 加入收藏
fanzhiyu1989
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-11-28
收藏
 问题点数:0 回复次数:4 
求助(关于运算符重载的一个c++程序)
//我是出学者,下面程序是运算符重载
//int  Matrix::operator()(int i,int j);
 //重载()m(k,l)表示取矩阵m中第k行,第l列元素
//friend Matrix operator+(Matrix &m1, Matrix &m2);
//重载+   两矩阵对应元素相加
//friend Matrix operator-(Matrix &m1, Matrix &m2);
//重载-   两矩阵对应元素相减
//编译时总是友元函数出问题,希望帮助解答一下,
//非常感谢!
#include<iostream>
using namespace std;
class Matrix           //矩阵类
 {
  private:
    const int rows,cols;  //矩阵的行数和列数
    int * mem;  //动态申请矩阵空间    
  public:
    Matrix(int r,int c,int *m);                                      
    Matrix(Matrix &m);//拷贝构造函数
    int operator()(int i,int j);
    void operator=(Matrix &m);
    friend Matrix operator+(Matrix &m1,Matrix &m2); //编译的时候从这行开始出错
    friend Matrix operator-(Matrix &m1,Matrix &m2);
    void print();
    ~Matrix() {delete mem;}
  };
//类中的常数据成员需用构造函数的初始化表来初始化
 Matrix::Matrix(int r,int c,int *m):rows(r),cols(c)  
 {int i;
  mem=new int[r*c];
  for(i=0;i<r*c;i++)
    mem[i]=m[i];
}                    
 
 Matrix::Matrix(Matrix &m):rows(m.rows),cols(m.cols)
 {int i;
 mem=new int[m.rows*m.cols];
 for(i=0;i<m.rows*m.cols;i++)
   mem[i]=m.mem[i];
 }

 int Matrix::operator()(int i,int j)
 {int k;
  k=(i-1)*cols+j;
     return(mem[k-1]);
 }

void Matrix::operator=(Matrix &m)
{int i;
 mem=new int[m.rows*m.cols];
 for(i=0;i<m.rows*m.cols;i++)
   mem[i]=m.mem[i];
}

 Matrix operator+(Matrix &m1, Matrix &m2)
 {Matrix m3;
  int i;
  for(i=0;i<m1.rows*m1.cols;i++)
  m3.mem[i]=m1.mem[i]+m2.mem[i];
  return m3;
 }
 
 Matrix operator-(Matrix &m1, Matrix &m2)
 {Matrix m3;
  int i;
  for(i=0;i<m1.rows*m2.cols;i++)
  m3.mem[i]=m1.mem[i]-m2.mem[i];
  return m3;
 }

 void Matrix::print()
 {int k;
  for(k=0;k<rows*cols;k++)
     { cout<<mem[k]<<" ";
       if((k+1)%cols==0)   
           cout<<endl;                    //换行
     }
 }

 
int main()
{ int a[9]={2,0,0,0,2,0,0,0,2};
  int b[9]={1,0,0,0,1,0,0,0,1};
    Matrix mat1(3,3,a),mat2(3,3,b);
 cout<<"矩阵1:"<<endl;
 mat1.print();
 cout<<"矩阵2:"<<endl;
 mat2.print();
 cout<<"矩阵1第1行第1列元素是:"<<mat1(1,1)<<endl;   //取矩阵mat1的第1行第1列元素
 cout<<"矩阵2第1行第2列元素是:"<<mat1(1,2)<<endl;   //取矩阵mat2的第1行第2列元素
 Matrix mat3=mat1+mat2;
 Matrix mat4=mat1-mat2;
 cout<<"矩阵1与矩阵2之和是:";
 mat3.print();
 cout<<"矩阵1与矩阵2之差是:";
 mat4.print();
 return 0;
}
搜索更多相关主题的帖子: 运算符 重载 
2008-11-28 15:55
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:0 
友元函数没有问题,是因为没有默认构造函数造成的.
Matrix m3;//这样的类定义,需要调用到默认构造函数,
解决方法:
1为类增加默认构造函数
Matrix::Matrix():rows(0)
,cols(0)
,mem(NULL)
{
}
2或者使用已有构造函数,在定义类对象时如下:
Matrix m3(0,0,NULL);
2008-11-28 21:35
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
Matrix operator+(Matrix &m1, Matrix &m2)
{Matrix m3;
  int i;
  for(i=0;i<m1.rows*m1.cols;i++)
  m3.mem[i]=m1.mem[i]+m2.mem[i];
  return m3;
}中的 Matrix m3; 没有适合的构造函数

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-28 22:00
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
VS2005
#include<iostream>
using namespace std;



class Matrix    //矩阵类
{
private:
    const int rows,cols;  //矩阵的行数和列数
    int * mem;  //动态申请矩阵空间   
public:
    //Matrix();
    Matrix(int r,int c,int *m);                                      
    Matrix(Matrix &m);//拷贝构造函数
    int operator()(int i,int j);
    void operator=(Matrix &m);
    //#pragma optimize( "", off )
    friend Matrix operator+(Matrix &m1,Matrix &m2);    // 编译的时候从这行开始出错
    friend Matrix operator-(Matrix &m1,Matrix &m2);
    //#pragma optimize( "", on )
    void print();
    ~Matrix() {delete mem;}
};
//类中的常数据成员需用构造函数的初始化表来初始化
Matrix::Matrix(int r,int c,int *m):rows(r),cols(c)  
{int i;
mem=new int[r*c];
for(i=0;i<r*c;i++)
mem[i]=m[i];
}                    

Matrix::Matrix(Matrix &m):rows(m.rows),cols(m.cols)
{int i;
mem=new int[m.rows*m.cols];
for(i=0;i<m.rows*m.cols;i++)
mem[i]=m.mem[i];
}

int Matrix::operator()(int i,int j)
{int k;
k=(i-1)*cols+j;
return(mem[k-1]);
}

void Matrix::operator=(Matrix &m)
{int i;
mem=new int[m.rows*m.cols];
for(i=0;i<m.rows*m.cols;i++)
mem[i]=m.mem[i];
}

Matrix  operator+(Matrix &m1, Matrix &m2)
{
    int *array=new int[m1.rows*m1.cols];
    Matrix m3(m1.rows,m1.cols,array);
int i;
for(i=0;i<m1.rows*m1.cols;i++)
m3.mem[i]=m1.mem[i]+m2.mem[i];
return m3;
}

Matrix operator-(Matrix &m1, Matrix &m2)
{
        int *array=new int[m1.rows*m1.cols];
    Matrix m3(m1.rows,m1.cols,array);
int i;
for(i=0;i<m1.rows*m2.cols;i++)
m3.mem[i]=m1.mem[i]-m2.mem[i];
return m3;
}

void Matrix::print()
{int k;
for(k=0;k<rows*cols;k++)
{ cout<<mem[k]<<" ";
if((k+1)%cols==0)   
cout<<endl;                    //换行
}
}


int main()
{ int a[9]={2,0,0,0,2,0,0,0,2};
int b[9]={1,0,0,0,1,0,0,0,1};
Matrix mat1(3,3,a),mat2(3,3,b);
cout<<"矩阵1:"<<endl;
mat1.print();
cout<<"矩阵2:"<<endl;
mat2.print();
cout<<"矩阵1第1行第1列元素是:"<<mat1(1,1)<<endl;   //取矩阵mat1的第1行第1列元素
cout<<"矩阵2第1行第2列元素是:"<<mat1(1,2)<<endl;   //取矩阵mat2的第1行第2列元素
Matrix mat3=mat1+mat2;
Matrix mat4=mat1-mat2;
cout<<"矩阵1与矩阵2之和是:";
mat3.print();
cout<<"矩阵1与矩阵2之差是:";
mat4.print();
return 0;
}

修正.JPG (59.33 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-28 22:27
fanzhiyu1989
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-11-28
收藏
得分:0 
非常感谢帮我改了这个程序,可是改后的程序在 viusal c++6.0简体中文企业版  运行时还是显示INTERNAL COMPILER ERROR
想请问一下是不是编译工具的问题
2008-11-30 12:30
快速回复:求助(关于运算符重载的一个c++程序)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013137 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved