#include <iostream>
#include <memory>
#include <cassert>
class Matrix {
private:
    int rows;
    int cols;
    std::shared_ptr<std::shared_ptr<int>> Mat;
public:
    Matrix() = default;
    Matrix(const int& rows, const int& cols) : rows(rows), cols(cols)
    {
        Mat.reset(new std::shared_ptr<int>[rows], [](std::shared_ptr<int>* p) { delete[] p; });
        for (int i = 0; i < rows; ++i)
        {
            Mat.get()[i].reset(new int[cols], [](int* p) { delete[] p; });
        }
        for (int i = 0; i < (*this).rows; ++i)
            for (int j = 0; j < (*this).cols; ++j)
                (*this)[i][j] = 0;
    }
    int* operator[](const int& index) const
    {
        return Mat.get()[index].get();
    }
    Matrix(const Matrix& other) : cols(other.cols), rows(other.rows)
    {
        Mat.reset(new std::shared_ptr<int>[rows], [](std::shared_ptr<int>* p) { delete[] p; });
        for (int i = 0; i < rows; ++i)
        {
            Mat.get()[i].reset(new int[other.cols], [](int* p) { delete[] p; });
        }
        for (int i = 0; i < other.rows; i++)
            for (int j = 0; j < other.cols; j++)
                (*this)[i][j] = other[i][j];
    }
    Matrix& operator=(const Matrix& other)
    {
        if (Mat != other.Mat && cols == other.cols && rows == other.rows)
        {
            for (int i = 0; i < rows; i++)
                for (int j = 0; j < cols; j++)
                    (*this)[i][j] = other[i][j];
            return *this;
        }
        else
            return *this;
    }
    Matrix operator+(const Matrix& other) const
    {
        Matrix temp(rows, cols);
        for (int i = 0; i < rows; i++)
            for (int j = 0; j < cols; j++)
                temp[i][j] += other[i][j] + (*this)[i][j];
        return temp;
    }
    friend std::ostream& operator<<(std::ostream& os, Matrix& m)
    {
        for (int i = 0; i < m.rows; ++i)
        {
            for (int j = 0; j < m.cols; ++j)
            {
                os << m[i][j] << "  ";
            }
            os << std::endl;
        }
        return os;
    }
};
int main()
{
    Matrix a(2, 2);
    a[0][0] = 1;
    a[0][1] = 1;
    std::cout << a << std::endl;
    Matrix b(2, 2);
    b[1][1] = 1;
    b[1][0] = 1;
    std::cout << b << std::endl;
    b[1][0] = 9;
    Matrix c(a);
    c[0][0] = 6;
    std::cout << c << std::endl;
    Matrix d = b;
    std::cout << d << std::endl;
    Matrix e = a + b;
    std::cout << e << std::endl;
}
I have solved it myself in the end :D