gpt4 book ai didi

c++ - 具有重载的矩阵。不能使用多个运算符

转载 作者:行者123 更新时间:2023-11-28 06:19:01 24 4
gpt4 key购买 nike

我正在处理重载矩阵。当仅使用一个运算符 (+) 代码时工作正常,但当我尝试添加 (-) 或 (*) 时,出现似乎是分配问题的错误。

“Overload.exe 中 0x00077E3B 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000000。”

在类里面:

Macierz::Macierz(int a,int b)    // Matrix
{
Alokacja(); // Allocate
}

Macierz::Macierz(const Macierz& a_mac) : m(a_mac.m), n(a_mac.n)
{
Alokacja();
for (int i = 0; i<m; i++) {
for (int j = 0; j<n; j++) {
macierz[i][j] = a_mac.macierz[i][j];
}
}
}


void Macierz::Jedynki() // Matrix::Ones
{
for(int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
{
macierz [i][j]=1;
}
}
}

void Macierz::Wyswietl() // Matrix::Display
{
for (int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
cout <<macierz[i][j]<<"\t";
cout <<endl;
}
}

Macierz Macierz::operator +(const Macierz & mac)
{
Macierz tmp(mac);
for(int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
{
mac.macierz[i][j]=macierz[i][j]+mac.macierz[i][j];
}
}
return tmp;

}
Macierz Macierz::operator *(const Macierz & mac)

{
Macierz tmp(mac);
for (int i = 0; i<m; i++)
{
for (int j = 0; j<n; j++)
{
mac.macierz[i][j] = 0;
for (int k = 0; k<n; k++)
{
mac.macierz[i][j] += macierz[i][k] * mac.macierz[k][j];

}

}
return tmp;

}
}




void Macierz::Alokacja()
{
macierz=new double*[m];
for(int i=0;i<m;i++)
{
macierz[i]= new double[n];
}
cout <<endl;
}
Macierz::~Macierz()
{
for (int i=0;i<m;i++)
delete []macierz[i];
delete []macierz;
}

在 main.cpp 中:

cout<<"macierze"<<endl;       // "matrices"

Macierz i(2,2);
Macierz j(2,2);
Macierz k(2,2);
Macierz macierz(2,2);

macierz.Wyswietl();

i.Jedynki();
j.Jedynki();
k.Jedynki();
(i+j).Wyswietl();


cout << "A tu przemnozona" << endl; // "and here is multiplied"


(i*j).Wyswietl();


system("pause");
return 0;
}

在标题中:

class Macierz            // Matrix
{
public:
int m, n;
double **macierz;


Macierz(int a, int b);
Macierz(const Macierz&);

void Alokacja(); // Allocate
void Jedynki(); // Ones
void Wyswietl(); // Display
Macierz operator +(const Macierz& mac);
Macierz operator *(const Macierz& mac);
~Macierz(void);
};

最佳答案

好吧,您的operator+ 似乎也不起作用。

当一个临时的tmp对象在这里创建时:

Macierz tmp(mac);

存在于堆栈中,稍后,当函数完成时,它的析构函数将被调用,这会杀死所有堆分配的元素。而且,它还会杀死参数的数据,因为它的成员 macierz 指向与临时对象相同的内存块。

问候

深层构造函数:

在标题中:

Macierz(const Macierz&);

在正文中:

Macierz::Macierz(const Macierz& a_mac) : m(a_mac.m),n(a_mac.n)
{
Alokacja();
for(int i=0;i<m;i++) {
for (int j=0;j<n;j++) {
macierz[i][j] = a_mac.macierz[i][j];
}
}
}

关于c++ - 具有重载的矩阵。不能使用多个运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29639740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com