Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++重载:算子+元素加矩阵_C++_Matrix_Operators_Operator Overloading_Addition - Fatal编程技术网

C++重载:算子+元素加矩阵

C++重载:算子+元素加矩阵,c++,matrix,operators,operator-overloading,addition,C++,Matrix,Operators,Operator Overloading,Addition,我试图为矩阵程序重载+运算符。这是我的代码,我觉得没问题。但是,当我在主函数中添加两个矩阵时,什么也没有发生。 有人能帮忙吗? 谢谢: 顺便说一句: -程序编译并运行良好,直到它应该添加到矩阵中为止 -我假设我的操作符+-函数的实现中存在问题,因为我已经将代码复制到addMtrx,Mtrx函数中进行测试,但它也不起作用 //Mtrx.h #ifndef MTRX_H_ #define MTRX_H_ #include <iostream> #include <string>

我试图为矩阵程序重载+运算符。这是我的代码,我觉得没问题。但是,当我在主函数中添加两个矩阵时,什么也没有发生。 有人能帮忙吗? 谢谢:

顺便说一句:

-程序编译并运行良好,直到它应该添加到矩阵中为止

-我假设我的操作符+-函数的实现中存在问题,因为我已经将代码复制到addMtrx,Mtrx函数中进行测试,但它也不起作用

//Mtrx.h

#ifndef MTRX_H_
#define MTRX_H_
#include <iostream>
#include <string>

using namespace std;
using std::ostream;

class Mtrx {
    int lines,cols;
    float **p;
public:

    Mtrx();
    Mtrx(int,int);
    int getLines();
    int getCols();
    float getElement(int,int);
    void setLines(int);
    void setCols(int);
    void setElement(int,int,float);

    Mtrx operator+(Mtrx&);

        ~Mtrx();
};

ostream& operator<<(ostream& os, Mtrx& m);

#endif /* MTRX_H_ */
//Mtrx.cpp

//...
//...
Mtrx::~Mtrx(){
delete p;
p = NULL;
}

Mtrx Mtrx::operator+(Mtrx& m){
if(this->getLines() == m.getLines() && this->getCols() == m.getCols()){
    Mtrx res(getLines(),getCols());

    for (int i = 1; i <= this->getLines(); i++){
        for(int j = 1; j <= this->getCols(); j++){
            res.setElement(i,j,(this->getElement(i,j)+m.getElement(i,j)));
        }
    }

    return res;
}

您有一个析构函数,但缺少一个复制构造函数和赋值运算符。根据经验,如果你有任何一个,你应该拥有所有的

Mtrx(const Mtrx&);
Mtrx& operator=(const Mtrx&);
~Mtrx();
如果没有显式的复制构造函数,编译器将为您生成一个。但它并不聪明,所以当它复制一个矩阵时,它不知道为p分配新的内存。它只是复制指针,导致原始矩阵和副本都引用相同的内存。当他们的析构函数运行时,他们两人都会调用delete p,这对第二个人来说是个坏消息


这正是运算符+返回并复制res时发生的情况。

您有一个析构函数,但缺少一个复制构造函数和赋值运算符。根据经验,如果你有任何一个,你应该拥有所有的

Mtrx(const Mtrx&);
Mtrx& operator=(const Mtrx&);
~Mtrx();
如果没有显式的复制构造函数,编译器将为您生成一个。但它并不聪明,所以当它复制一个矩阵时,它不知道为p分配新的内存。它只是复制指针,导致原始矩阵和副本都引用相同的内存。当他们的析构函数运行时,他们两人都会调用delete p,这对第二个人来说是个坏消息


这正是operator+返回并复制res时发生的情况。

检查大括号。您可能缺少一个,或者iffalse的控制路径没有返回

Mtrx Mtrx::operator+(Mtrx& m){
if(this->getLines() == m.getLines() && this->getCols() == m.getCols()){
    Mtrx res(getLines(),getCols());

    for (int i = 1; i <= this->getLines(); i++){
        for(int j = 1; j <= this->getCols(); j++){
            res.setElement(i,j,(this->getElement(i,j)+m.getElement(i,j)));
        }
    }

    return res;
}

检查你的牙套。您可能缺少一个,或者iffalse的控制路径没有返回

Mtrx Mtrx::operator+(Mtrx& m){
if(this->getLines() == m.getLines() && this->getCols() == m.getCols()){
    Mtrx res(getLines(),getCols());

    for (int i = 1; i <= this->getLines(); i++){
        for(int j = 1; j <= this->getCols(); j++){
            res.setElement(i,j,(this->getElement(i,j)+m.getElement(i,j)));
        }
    }

    return res;
}

1..nLines和1..nCols的迭代看起来可疑。这是故意的还是你想从零开始?你能粘贴你的主文件吗?运算符+看起来正常。从1..nLines和1..nCols开始的迭代看起来可疑。这是故意的还是你想从零开始?你能粘贴你的主文件吗?operator+看起来不错。谢谢。这似乎就是问题的症结所在。我是C++初学者,所以我很难实现三的规则。数小时之后,我确定我的新赋值运算符和析构函数正在工作,但我的复制构造函数仍然没有:Mtrx::Mtrxconst Mtrx&m{对不起,格式化,我比C++更差。谢谢。这似乎是问题所在。我是C++初学者,所以我在执行三的规则时有困难。经过几个小时和几个小时,我确定我的新赋值操作符和析构函数正在工作,但是我的复制构造函数仍然没有。StMrx& M.C.To.Fufft关于格式化,我比在C++中更糟糕。