我正在研究Matrix类,但我无法弄清楚为什么我得到这个错误,因为我已经定义了有问题的函数(Dopisi())。这是我到目前为止:
这是我到目前为止所做的:
#include<IOStream>
using namespace std;
class Matrica{
private:int Duzina;
int Sirina;
int** pok;
public:
Matrica(){//default constructor
Duzina=0;
Sirina=0;
int i,j;
pok=new int* [Duzina];
for(i=0;i<Duzina;i++){
pok[i]=new int[Sirina];
}
}
Matrica(int duz,int sir){//constructor
Duzina=duz;
Sirina=sir;
int i,j;
pok=new int* [Duzina];
for(i=0;i<Duzina;i++){
pok[i]=new int[Sirina];
for(j=0;j<Sirina;j++){
pok[i][j]=0;
}
}
}
void Dodaj(int i,int j){//add one element
cout<<"Unesite element ["<<i<<"]["<<j<<"]"<<endl;
cin>>pok[i][j];
}
void Popuni(){//fill entire matrix
int i,j;
for(i=0;i<Duzina;i++)
for(j=0;j<Sirina;j++)
Dodaj(i,j);
}
Matrica(Matrica& mat){//copy constructor
Duzina=mat.Duzina;
Sirina=mat.Sirina;
int i,j;
pok=new int* [Duzina];
for(i=0;i<Duzina;i++){
pok[i]=new int[Sirina];
for(j=0;j<Sirina;j++){
pok[i][j]=mat.pok[i][j];
}
}
}
~Matrica(){}
int max(int a,int b){//max value
if(a>b)return a;
else
return b;
}
void Ispis(){//cout
int i,j;
for(i=0;i<Duzina;i++){
for(j=0;j<Sirina;j++){
cout<<pok[i][j]<<" ";
}
cout<<endl;
}
}
Matrica& operator =(const Matrica& x){
for(int i=0;i<Duzina;i++)
delete pok[i];
Duzina=x.Duzina;
Sirina=x.Sirina;
for(int i=0;i<Duzina;i++){
for(int j=0;j<Sirina;j++){
pok[i][j]=x.pok[i][j];
}
}
return *this;
}
Matrica Dopisi(const Matrica a,const Matrica b);
};
Matrica Matrica::Dopisi(const Matrica a,const Matrica b){//function must take two matrices
int i,j,duz,sir;
duz=max(a.Duzina,b.Duzina);
sir=a.Sirina+b.Sirina;
Matrica temp(duz,sir);
for(i=0;i<a.Duzina;i++){
for(j=0;j<a.Sirina;j++){
temp.pok[i][j]=a.pok[i][j];
}
}
for(i=0;i<b.Duzina;i++){
for(j=0;j<b.Sirina;j++){
temp.pok[i][j+a.Sirina]=b.pok[i][j];
}
}
temp.Ispis();
// return temp;
}
int main(){
Matrica mat1(3,3);
mat1.Popuni();
mat1.Ispis();
Matrica mat2(4,4);
mat2.Popuni();
mat2.Ispis();
mat2=mat1;
mat2.Ispis();
Matrica mat3;
mat3=Dopisi(mat1,mat2);
system("pause");
return 0;
}
P.S.变量和方法的名字都是塞尔维亚语,希望你能弄明白。提前谢谢
答案 0 :(得分:2)
Dopisi
是Matrica
类中的成员函数。如果你想让它成为一个独立的功能,它应该在外面类中声明或定义。
如果您希望它能够访问私有成员,则将其声明为friend
函数,或将其设置为static
成员函数(但是您必须将其称为{{1} }})。
答案 1 :(得分:1)
制作功能
public:
static Matrica Dopisi(const Matrica &a,const Matrica &b);
然后你可以在课外叫它
mat3 = Matrica::Dopisi(mat1,mat2);
不需要类的实例
答案 2 :(得分:0)
您正在呼叫Dopisi
,就像它是常规功能一样。它是一个成员函数,因此需要在类Matrica
的实例上调用。这个函数的实际样式表明,作为非成员函数,当前调用此函数会更好,它需要一个Matrica
实例来调用,但也需要Matrica
的2个实例作为参数,也返回第四个。因此,您总共有4个实例。使用带有Matrica
的t实例并返回结果的非成员函数似乎更合适。
这当然也需要在该函数中访问的类的私有成员的getter / setter函数。
答案 3 :(得分:0)
您将Dopisi
函数声明为类方法(将其放在类声明中),然后将其称为全局函数。例如,它可以被称为mat3.Dopisi(mat1, mat2)
。
在您的情况下,Dopisi
需要访问Matrica
类,所以只需将其设为好友函数:
...
// in class declaration:
friend Matrica Dopisi(const Matrica a,const Matrica b);
...
// in function definition:
Matrica Dopisi(const Matrica a,const Matrica b){//function must take two matrices
...
//保留你的函数调用
答案 4 :(得分:0)
除了函数问题外,类定义无效。首先,析构函数不释放由pok指向的内存。赋值运算符也是错误的。
Matrica& operator =(const Matrica& x){
for(int i=0;i<Duzina;i++)
delete pok[i];
Duzina=x.Duzina;
Sirina=x.Sirina;
for(int i=0;i<Duzina;i++){
for(int j=0;j<Sirina;j++){
pok[i][j]=x.pok[i][j];
}
}
return *this;
}
首先而不是delete pok[i];
应该是delete []pok[i];
而且你没有根据Duzina和Sirina的新值释放已用内存并分配新内存。
因此,操作符函数具有未定义的行为,并且毫无疑问其工作将导致程序异常。