运算符 [][] 矩阵 C++

operator [][] matrix c++

我正在尝试创建一个运算符,为我提供某个矩阵的位置 i、j 的值,以及另一个“填充”给定位置的矩阵的值,我尝试放置您可以看到的运算符在 header 但它不起作用,问题可能出在其他地方,但我认为这是主要问题:


    int main()
    {
        matriz a(3,3);
        matrizQuad b(3);
    
        for(size_t i=0;i<3;++i)
            for(size_t j=0;j<3;++j){
                a[i][j]=1;
                b[i][j]=2;
            }
        matriz c=a+b;
        cout << "a+b:\n" << c << "\n";
        cout << "traco: " << b.traco() << "\n";
    
        return 0;
    } ``` 
    
    Header:
    
    #ifndef MATRIZES_H
    #define MATRIZES_H
    #include <iostream>
    #include <vector>
    #include <ostream>
    #include <sstream>
    using namespace std;
    
    typedef vector<vector<double>> array;
    
    class matriz
    {
    protected:
        int iLargura, iComprimento;
        array m;
    public:
        matriz(int L, int C): iLargura (L), iComprimento (C)
        {
            array m(L);
            for (int i = 0; i<L;i++)
                m[i].resize(C);
        };
    
        int nL() const {return iLargura;}
        int nC() const {return iComprimento;}
    
        vector<double>& operator[] (int i) {return  m[i];}
        const vector<double>& operator[] (int i) const {return  m[i];}
    
    };
    
    class matrizQuad: public matriz
    {
    public:
        matrizQuad (int T): matriz(T,T) {}
        double traco();
    };
    
    matriz operator+(const matriz& m1, const matriz& m2);
    ostream& operator<<(ostream& output, const matriz& m1);
    
    
    #endif // MATRIZES_H
    
    Body: 
    
    #include "matriz.h"
    
    
    double matrizQuad::traco()
    {
        double dSoma = 0;
        for (int i = 0;i<iLargura; i++)
            for (int j = 0;i<iLargura; i++)
                if (i==j)
                    dSoma = dSoma + m[i][j];
        return dSoma;
    }
    
    matriz operator+(const matriz& m1, const matriz& m2)
    {
        int C1 = m1.nC();
        int L1 = m1.nL();
        matriz m(C1,L1);
    
        for (int i = 0;i<C1; i++)
            for (int j = 0;i<L1; i++)
                m[i][j] = m1[i][j] + m2[i][j];
        return m;
    }
    
    ostream& operator<<(ostream& output, const matriz& m1)
    {
        for(int i = 0; i< m1.nL();i++)
        {
            for (int j=0;j<m1.nC();j++)
                output << m1[i][j] << " ";
            output << "\n";
        }
    
        return output;
    }




您的class有一个成员

array m;

此嵌套矢量永远不会调整大小。它的大小为 0.

在构造函数中声明一个同名的嵌套向量

array m(L);

您在构造函数中调整了其内部向量的大小。对成员内部向量元素的任何后续访问都是越界的。

不要在构造函数中声明另一个同名的嵌套向量,而是调整成员的大小。

请注意,arraystd::vector<std::vector<double>> 具有误导性。此外,嵌套向量不是高效的二维数据结构。无论如何,还不清楚你的 matriz 做了什么你不能从 std::vector<std::vector<double>>.

中得到的

按照 463035818_is_not_a_number 的建议修复数组大小调整,使您的矩阵可以正常工作。

    matriz(int L, int C): iLargura (L), iComprimento (C)
    {
        m.resize(L);
        for (int i = 0; i<L;i++)
            m[i].resize(C);
    };

如果您还打印矩阵 a 和 b,您将得到:

a:
1 1 1 
1 1 1 
1 1 1 

b:
2 2 2 
2 2 2 
2 2 2 

a+b:
3 0 0 
3 0 0 
3 0 0 

所以设置和打印矩阵工作得很好。错误在 operator +:

matriz operator+(const matriz& m1, const matriz& m2)
{
    int C1 = m1.nC();
    int L1 = m1.nL();
    matriz m(C1,L1);

    for (int i = 0;i<C1; i++)
        for (int j = 0;i<L1; i++)
            m[i][j] = m1[i][j] + m2[i][j];
    return m;
}

具体来说:

        for (int j = 0;i<L1; i++)

我猜你复制并粘贴了 i 的前一个循环,忘记重命名所有变量。