#include <iostream>
#include <iomanip>
#include <conio.h>
#include <new>
using namespace std;
class matrix
{
int r,c;
int **a;
public:
matrix();
matrix(matrix &);
~matrix();
friend istream &operator >>(istream &, matrix &);
friend ostream &operator <<(ostream &, matrix &);
friend matrix &operator +(const matrix &, const matrix &);
friend matrix operator *(const matrix &, const matrix &);
};
matrix::matrix()
{
}
matrix::matrix(matrix &p)
{
int i,j;
c=p.c;
r=p.r;
a=new int*[r];
for(i=0;i<c;i++)
{
a*=new int [c];
}
for(i=0;i<r;i++)
for(j=0;j<c;j++)
a*[j]=p.a*[j];
}
matrix::~matrix()
{
for(int i=0;i<r;i++)
delete []a*;
delete[]a;
}
istream &operator >>(istream &nhap, matrix &p)
{
int i,j;
cout<<"
Nhap so hang: ";
cin>>p.r;
cout<<"
Nhap so cot: ";
cin>>p.c;
p.a=new int*[p.r];
for(i=0;i<p.c;i++)
{
p.a*=new int [p.c];
}
if(p.a==NULL)
{
cout<<"
Khong du bo nho!";
exit(1);
}
for(i=0;i<p.r;i++)
for(j=0;j<p.c;j++)
{
cout<<"
Nhap phan tu thu a["<<i<<"]["<<j<<"]: ";
cin>>p.a*[j];
}
return nhap;
}
ostream &operator <<(ostream &xuat, matrix &p)
{
for(int i=0;i<p.r;i++)
{
for(int j=0;j<p.c;j++)
cout<<setw(3)<<p.a*[j];
cout<<endl;
}
return xuat;
}
matrix &operator +(const matrix &p1, const matrix &p2)
{
int i,j;
if(p1.c==p2.c&&p1.r==p2.r)
{
matrix p;
p.c=p1.c;
p.r=p1.r;
p.a=new int *[p.r];
for(i=0;i<p.c;i++)
p.a*=new int [p.r];
for(i=0;i<p.r;i++)
for(j=0;j<p.c;j++)
p.a*[j]=p1.a*[j]+p2.a*[j];
return p;
}
else
cout<<"
Ma tran khong cung cap!";
}
matrix operator *(const matrix &p1,const matrix &p2)
{
int i,j,k;
if(p1.c==p2.c&&p1.r==p2.r)
{
matrix p;
p.c=p1.c;
p.r=p1.r;
p.a=new int *[p.r];
for(i=0;i<p.c;i++)
p.a*=new int [p.r];
for(i=0;i<p.r;i++)
for(j=0;j<p.c;j++)
{
p.a*[j]=0;
for(k=1;k<=p.c;k++)
{
p.a*[j]+=p1.a*[k]*p2.a[k][j];
}
}
return p;
}
else
cout<<"
Ma tran khong cung cap!";
}
int main()
{
matrix p,p1;
cout<<"
Nhap ma tran p1
";
cin>>p1;
cout<<"
Xuat ma tran p1:
"<<p1;
matrix p2(p1);
cout<<"xuat ma tran p2
"<<p2;
p=p1+p2;
cout<<"
Tong hai ma tan la:
"<<p;
p1=p1*p2;
cout<<"
Tich hai ma tran la:
: "<<p;
p1.~matrix();
p2.~matrix();
p.~matrix();
getch();
return 0;
}
lỗi ở đây là cuối hàm tổng, tích thì phải return một lớp matrix,
nó chạy đến đây thì bị văng ra. hình như là lỗi truy cập vào bộ nhớ đã xóa. nếu xóa hàm
~matrix
thì ok nhưng yêu cầu đề bài phải có. biết lỗi nhưng không sửa được. ai biết chỉ cho mình với nha.
hình như bị lỗi chỗ phần else của các hàm tổng và tích đấy
coi lại đi
nó phải được trả ra kiểu giá trị khi else chứ
hiểu ý chứ
[QUOTE=10520130;106077]hình như bị lỗi chỗ phần else của các hàm tổng và tích đấy
coi lại đi
nó phải được trả ra kiểu giá trị khi else chứ
hiểu ý chứ[/QUOTE]
hix nếu là vậy nhưng nó vẫn bị mắc lỗi ở chỗ return anh kìa. ở đây khi nó return thì phải khởi tạo và hủy một lớp mới. cho nên nó bị truy cập vào vùng nhớ đã xóa nak
[QUOTE=11520139;106045]
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <new>
using namespace std;
class matrix
{
int r,c;
int **a;
public:
matrix();
matrix(matrix &);
~matrix();
friend istream &operator >>(istream &, matrix &);
friend ostream &operator <<(ostream &, matrix &);
friend matrix &operator +(const matrix &, const matrix &);
friend matrix operator *(const matrix &, const matrix &);
};
matrix::matrix()
{
}
matrix::matrix(matrix &p)
{
int i,j;
c=p.c;
r=p.r;
a=new int*[r];
for(i=0;i<c;i++)
{
a*=new int [c];
}
for(i=0;i<r;i++)
for(j=0;j<c;j++)
a*[j]=p.a*[j];
}
matrix::~matrix()
{
for(int i=0;i<r;i++)
delete []a*;
delete[]a;
}
istream &operator >>(istream &nhap, matrix &p)
{
int i,j;
cout<<"
Nhap so hang: ";
cin>>p.r;
cout<<"
Nhap so cot: ";
cin>>p.c;
p.a=new int*[p.r];
for(i=0;i<p.c;i++)
{
p.a*=new int [p.c];
}
if(p.a==NULL)
{
cout<<"
Khong du bo nho!";
exit(1);
}
for(i=0;i<p.r;i++)
for(j=0;j<p.c;j++)
{
cout<<"
Nhap phan tu thu a["<<i<<"]["<<j<<"]: ";
cin>>p.a*[j];
}
return nhap;
}
ostream &operator <<(ostream &xuat, matrix &p)
{
for(int i=0;i<p.r;i++)
{
for(int j=0;j<p.c;j++)
cout<<setw(3)<<p.a*[j];
cout<<endl;
}
return xuat;
}
matrix &operator +(const matrix &p1, const matrix &p2)
{
int i,j;
if(p1.c==p2.c&&p1.r==p2.r)
{
matrix p;
p.c=p1.c;
p.r=p1.r;
p.a=new int *[p.r];
for(i=0;i<p.c;i++)
p.a*=new int [p.r];
for(i=0;i<p.r;i++)
for(j=0;j<p.c;j++)
p.a*[j]=p1.a*[j]+p2.a*[j];
return p;
}
else
cout<<"
Ma tran khong cung cap!";
}
matrix operator *(const matrix &p1,const matrix &p2)
{
int i,j,k;
if(p1.c==p2.c&&p1.r==p2.r)
{
matrix p;
p.c=p1.c;
p.r=p1.r;
p.a=new int *[p.r];
for(i=0;i<p.c;i++)
p.a*=new int [p.r];
for(i=0;i<p.r;i++)
for(j=0;j<p.c;j++)
{
p.a*[j]=0;
for(k=1;k<=p.c;k++)
{
p.a*[j]+=p1.a*[k]*p2.a[k][j];
}
}
return p;
}
else
cout<<"
Ma tran khong cung cap!";
}
int main()
{
matrix p,p1;
cout<<"
Nhap ma tran p1
";
cin>>p1;
cout<<"
Xuat ma tran p1:
"<<p1;
matrix p2(p1);
cout<<"xuat ma tran p2
"<<p2;
p=p1+p2;
cout<<"
Tong hai ma tan la:
"<<p;
p1=p1*p2;
cout<<"
Tich hai ma tran la:
: "<<p;
p1.~matrix();
p2.~matrix();
p.~matrix();
getch();
return 0;
}
[/QUOTE]
- Nhìn sơ qua thấy, ở 2 toán tử + và * của em á. Ma trận p chứa kết quả trả về , nhưng em lại khai báo là local variable , nên khi hết tầm vực 2 toán tử này thì p sẽ bị hủy –> gọi destructor –> con trỏ thành viên Matrix::a sẽ bị giải phóng vùng nhớ . Mà em lại trả về tham chiếu tới đối tượng này mới chết. Em tham chiếu tới vùng nhớ đã hủy , nên việc xuất giá trị của đối tượng matrix này ở hàm main sẽ lỗi. Vài cách sửa;
- C1.Em thêm static vô : thành static Matrix p;
+C2. Em sửa kiểu trả về là matrix thôi, không trả về tham chiếu để cho nó tự sao chép kết quả , nhưng để làm cách này bắt buộc implement đầy đủ : ** copy contructor , toán tử gán, destructor. ( sao chép ở dạng deep copy nhé )**
- ở 2 toán tử em viết, có trường hợp không return dù kiểu trả về là Matrix , xem kỹ nha, đừng viết code ẩu kiểu này.
- ở hàm main, không cần gọi tường minh các destructor nha.
-Khi lớp có thành viên là pointer thì em nên viết đầu đủ :** copy contructor , toán tử gán, destructor. ( sao chép ở dạng deep copy nhé )**
[QUOTE=08520016;106116]- Nhìn sơ qua thấy, ở 2 toán tử + và * của em á. Ma trận p chứa kết quả trả về , nhưng em lại khai báo là local variable , nên khi hết tầm vực 2 toán tử này thì p sẽ bị hủy –> gọi destructor –> con trỏ thành viên Matrix::a sẽ bị giải phóng vùng nhớ . Mà em lại trả về tham chiếu tới đối tượng này mới chết. Em tham chiếu tới vùng nhớ đã hủy , nên việc xuất giá trị của đối tượng matrix này ở hàm main sẽ lỗi. Vài cách sửa;
- C1.Em thêm static vô : thành static Matrix p;
+C2. Em sửa kiểu trả về là matrix thôi, không trả về tham chiếu để cho nó tự sao chép kết quả , nhưng để làm cách này bắt buộc implement đầy đủ : copy contructor , toán tử gán, destructor. ( sao chép ở dạng deep copy nhé )
- ở 2 toán tử em viết, có trường hợp không return dù kiểu trả về là Matrix , xem kỹ nha, đừng viết code ẩu kiểu này.
- ở hàm main, không cần gọi tường minh các destructor nha.
-Khi lớp có thành viên là pointer thì em nên viết đầu đủ : copy contructor , toán tử gán, destructor. ( sao chép ở dạng deep copy nhé )[/QUOTE]
hihi cảm ơn anh nhiều nhiều nhé. mà anh ơi cách 2 đó anh nói rõ cái code cho em chút được không? hixx em chưa đọc đến đó anh nak
[QUOTE=11520139;106120]hihi cảm ơn anh nhiều nhiều nhé. mà anh ơi cách 2 đó anh nói rõ cái code cho em chút được không? hixx em chưa đọc đến đó anh nak[/QUOTE]
watch & learn http://www.mediafire.com/view/?ihwabj4wu738noq
phải chi em được học môn phương pháp lập trình hướng đối tượng nhỉ. Còn nhiều điều chưa hiểu quá :unhappy:
[QUOTE=09520019;106170]watch & learn http://www.mediafire.com/view/?ihwabj4wu738noq[/QUOTE]