gpt4 book ai didi

c++ - 重载运算符*(乘法)返回不同的结果

转载 作者:行者123 更新时间:2023-11-30 01:02:02 25 4
gpt4 key购买 nike

我创建了 class Matrix 并为矩阵乘法重载了 operator*。在运算符内部计算是正确的,但返回的结果与此不同。

我尝试将此函数从友元函数更改为方法,但得到了相同的结果。此外,我重载了像 +、- 这样的运算符,它们工作正常

#include <iostream>
#include <math.h>

template<typename T> class Matrix;
template<typename T> Matrix<T> operator * (const Matrix<T>&, const Matrix<T>&);

template <typename T> class Matrix
{
public:
T *arr = nullptr;
int r, c;
friend Matrix<T> operator * <> (const Matrix<T>&, const Matrix<T>&);

Matrix(T *a, int r, int c) //parametrized constructor
{
this->arr = a;
this->r = r;
this->c = c;
}

void Print()
{
for(int i=0; i<r; i++)
{
std::cout<<"|";
for(int j=0; j<c; j++)
{
std::cout<<*(this->arr+i*c+j)<<" ";
}

std::cout<<'\b';
std::cout<<"|";
std::cout<<std::endl;
}
std::cout<<std::endl;
}

};

template <typename T> Matrix<T> operator * (const Matrix<T> &M1, const Matrix<T> &M2)
{
int r = M2.r;
int c = M1.c;
int l = M1.r;
T arr[r*c];
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
arr[i*r+j]=0;
for(int k=0; k<l; k++)
{
arr[i*r+j]+=(M1.arr[k*r+j]*M2.arr[i*l+k]);
}
std::cout<<std::endl;
}
}
//Matrix<T> x(arr, r, c);
//x.Print(); -this returns correct matrix
return Matrix<T>(arr, r, c);
}

主要

int main()
{
//here I created matrixes a and b but skipped this part of code
Matrix<int> c = a*b;
c.Print(); // - this returns wrong matrix
}

如您所见,cx 是根据相同数据创建的矩阵,但我得到了两个不同的结果。

|22 28|
|49 64|

来自x.Print(),和

|4761920 4557403|
|4199040 7011960|

来自 c.Print()

最佳答案

问题在于 Matrix 构造函数保留了指向分配在堆栈 (arr) 上的对象的指针。一旦 arr 超出范围,任何取消引用指针的尝试都将导致 undefined behaviour。 .

您需要找到一种不同的方法来管理矩阵数据的生命周期(例如,让矩阵类保留它自己的拷贝)。

关于c++ - 重载运算符*(乘法)返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57030062/

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