【问题标题】:operators overloads matrix c++ ** without proxy ** [duplicate]运算符重载矩阵c ++ **没有代理** [重复]
【发布时间】:2017-04-26 05:22:08
【问题描述】:

需要帮助

我是运算符重载的新手, 现在我正在尝试初始化一个 使用运算符 [][] 重载的矩阵。 我想使用以下方式初始化矩阵: 矩阵 [0][0] =100

可以使用 [][] 吗?我如何使用它们?

 //main.cpp//
 void main()
    {
        Matrix m(2, 2);
        m[0][0] = 2;
    }


//matrix.h//
#ifndef MATRIX_H
#define MATRIX_H


class Matrix
{
public :
    Matrix(int ,int );
    Matrix operator [][] // *****im stuck here*****


private : 
    int numRows;
    int numCols;
    int **matrix;  
}
#endif


//matrix.cpp//

#include <iostream>
#include "Matrix.h"
using namespace std;


Matrix::Matrix(int rows,int cols)
    :numOfCols(cols),numOfRows (rows)
{
    matrix=new int *[cols];
    for(int i=0;i<rows;i++)
    {
        matrix[i]=new int [cols];
        for(int c=0;c<cols;c++)
        {
            matrix[i][c]=0;
        }


    }
}

【问题讨论】:

  • 与其编写所有这些代码,不如直接使用std::array&lt;std::array&lt;int columnCount&gt;, rowCount&gt;?你仍然会得到foo[y][x] 语法。
  • @Jack Deeth 是个坏主意,如果 ne 需要一个无间隙的值数组,例如在其他地方使用。从性能 POV 来看也是个坏主意。这是一个教育练习 - 不会削减它。

标签: c++ matrix overloading operator-keyword


【解决方案1】:

有很多方法可以做到这一点,这是我之前准备的一种,它使用代理类来表示行。请注意,它不会特别高效,并且不实现复制/分配/移动等。

#include <iostream>
using namespace std;


class Mat2 {

    public:

        Mat2( unsigned int x, unsigned int y ) :
            mX(x), mY(y), mData( new int[x * y] ) {}

        ~Mat2() { 
            delete [] mData; 
        }


        int & At( unsigned int x ,unsigned int y ) {
            return mData[ x * mY + y ];
        }

        class XProxy {
            public:
                XProxy( unsigned int x, Mat2 * mat ) :mX(x), mMat(mat) {}
                int & operator[]( unsigned int y ) {
                    return mMat->At( mX, y );
                }
            private:
                unsigned int mX;
                Mat2 * mMat;
        };


        XProxy operator[]( unsigned int x)  {
            return XProxy(x, this);
        }

    private:

        unsigned int mX, mY;
        int * mData;

};

int main() {
    Mat2 m(4,6);
    m[1][3] = 42;
    cout << m.At( 1, 3 ) << endl;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    相关资源
    最近更新 更多