一点点c++的学习问题
还有一个小时就到截止时间,我不太好打扰我的teacher问问题了,现在就是很想知道自己错的要怎么改,好像找到错误了
应该是运算符重载乘号哪个函数那里,调试到return c就运行不下去了
#include<iostream>
using namespace std;
int m;
class MyMatrix
{
private:
int n;
//friend MyMatrix opertor* (MyMatrix& m1, MyMatrix& m2);
//int** a = new int* [n];
public:
MyMatrix(){}
MyMatrix(int nn)
{
n = nn;
}
//MyMatrix(1)
friend MyMatrix operator* (MyMatrix& m1, MyMatrix& m2);
int** arr = new int*[n];
//for(int i=0;i<n;i++)
void input(int n);
void show();
~MyMatrix();
};
MyMatrix operator*(MyMatrix& c1,MyMatrix &c2)
{
int i, j, k, sum;
MyMatrix c(m);
for (int i = 0; i < m; i++)
{
c.arr[i] = new int[m];
}
for (i = 0; i < m; i++)
{
for (j = 0; j < m; j++)
{
sum = 0;
for (k = 0; k < m; k++)
{
sum += c1.arr[i][k] * c2.arr[k][j];
}
c.arr[i][j] = sum;
}
}
return c;
}
void MyMatrix::input(int n)
{
int i, j;
for (int i = 0; i < n; i++)
{
arr[i] = new int[n];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
cin >> *(*(arr+i)+j);
}
}
}
void MyMatrix::show()
{
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < m; j++)
{
cout << arr[i][j];
cout << " ";
}
cout << endl;
}
}
MyMatrix::~MyMatrix()
{
for (int i = 0; i < n; i++)
{
delete[] arr[i];
}
delete[] arr;
}
int main()
{
int c;
cin >> c;
//int n;
cin >> m;
MyMatrix b(m);
b.input(m);
for(int k=1;k<m;k++)
{
//cin >> m;
MyMatrix a(m);
a.input(m);
b = b * a;
}
b.show();
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:class Teacher
{
public:
Teacher();
~Teacher() {};
void setdata(); //设置教师信息
sTeacher getdata(); //获得教师信息
void setnext(Teacher*m_next); //将m_next指向next域
void showdata(); //显示教师信息
Teacher *getnext(); //获得下一个节点地址指针
string getname(); //获取单个教师的某项信息,下同
string getsex();
string getbirdata();
string getworkdata();
string getlevel();
string getpost();
string getadr();
string gettel();
void setname(string pname); //设置单个教师的某项信息,下同
void setsex(string psex);
void setbirdata(string pbirdata);
void setworkdata(string pworkdata);
void setlevel(string plevel);
void setpost(string ppost);
void setadr(string padr);
void settel(string ptel);
int input(ifstream & is); //文件操作
void output(ofstream &os);
private:
Teacher *next;
struct sTeacher m_Teacher;
};
class ClinkList
{
private:
Teacher *head;
Teacher Node;
public:
ClinkList();
~ClinkList();
void CreatList();
Teacher*GetNode(int index); //获得第index个节点的指针
void Insert(int index); //在第index个位置插入一个教师信息
void Delete(int index); //删除第index个位置的教师信息
int lenth(); //求链表长度(教师个数)
void Ranking(); //对现有教师姓名进行字典从大到小排序
void ShowList(); //输出所有教师信息
void Seachbyname(string panme); //按对应信息查找教师信息,下同
void Seachbylevel(string plevel);
void Seachbypost(string ppost);
void Seachbytel(string ptel);
void Save(string filename); //保存文件
void Load(string filename); //读取文件
};
题主基础比较差啊,像int** arr = new int*[n];
这种直接在类内初始化的成员的调用会发生在构造函数之前,所以n还没赋值,n是个随机数
修改上面这个问题后,还是会崩溃,是由于没有实现拷贝构造函数,在return c的时候会生成一个临时对象,由于调用默认拷贝构造函数,此时临时对象和c都拥有二级指针arr,然后它们释放的时候,释放的是同一个资源就崩溃了
还有b = b * a;
这一句话会调用拷贝赋值函数,也没实现