c_cpp 使用unique_ptr和make_unique在C ++ 11 / C ++ 14中使用Matrix

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 使用unique_ptr和make_unique在C ++ 11 / C ++ 14中使用Matrix相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <memory>

#include "Matrix.hpp"

using namespace std;
using namespace zgt;

constexpr size_t num_elements{ 3};

int main() {
    Matrix m{ num_elements }; // Squared matrix
    
    double inc{ 1 };
    for (size_t i{ 0 }; i < num_elements; i++) {
        for (size_t j{ 0 }; j < num_elements; j++) {
            m[i][j] = inc++;
        }
    }
    
    for (size_t i{ 0 }; i < num_elements; i++) {
        for (size_t j{ 0 }; j < num_elements; j++) {
            if (j == 0) {
                cout << m[i][j];
            } else {
                cout << ", " << m[i][j];
            }
        }
        
        cout << endl;
    }
    
    return 0;
}
#pragma once

#ifndef MatrixRow_hpp
#define MatrixRow_hpp

#include <iostream>
#include <memory>

namespace zgt {
    class MatrixRow{
        struct _impl;
        std::unique_ptr<_impl> pimpl;
    public:
        MatrixRow(size_t cols);
        ~MatrixRow();
        
        double& operator[](size_t index);
    };
}

#endif
#include "MatrixRow.hpp"

using namespace std;
using namespace zgt;

struct MatrixRow::_impl {
    unique_ptr<double[]> _v;
    
    _impl(size_t cols): _v(make_unique<double[]>(cols)) {}
};

double& MatrixRow::operator[](size_t index) {
    return pimpl->_v[index];
}

MatrixRow::MatrixRow(size_t cols) : pimpl(make_unique<_impl>(cols)) {}
MatrixRow::~MatrixRow() = default;
#pragma once

#ifndef Matrix_hpp
#define Matrix_hpp

#include <iostream>
#include <memory>

#include "MatrixRow.hpp"

namespace zgt {
    class Matrix{
        struct _impl;
        std::unique_ptr<_impl> pimpl;
    public:
        Matrix(size_t rows, size_t cols);
        Matrix(size_t size); // [size][size]
        ~Matrix();
        
        MatrixRow& operator[](size_t index);
    };
}

#endif
#include "Matrix.hpp"

using namespace std;
using namespace zgt;

struct Matrix::_impl {
    unique_ptr<unique_ptr<MatrixRow>[]> _m;
    
    _impl(size_t rows, size_t cols): _m(make_unique<unique_ptr<MatrixRow>[]>(rows)) {
        for (size_t i{ 0 }; i < cols; i++) {
            _m[i] = make_unique<MatrixRow>(cols);
        }
    }
};

MatrixRow& Matrix::operator[](size_t index) {
    return *(pimpl->_m[index]);
}

Matrix::Matrix(size_t rows, size_t cols) : pimpl(make_unique<_impl>(rows, cols)) {}
Matrix::Matrix(size_t size) : Matrix::Matrix(size, size) {}
Matrix::~Matrix() = default;

以上是关于c_cpp 使用unique_ptr和make_unique在C ++ 11 / C ++ 14中使用Matrix的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 的std ::的unique_ptr

c_cpp std :: unique_ptrのデリータ指定(关数渡し)

c_cpp std :: unique_ptrのデリータ指定方法(デフォルトデリータの特殊化版)

c_cpp std :: unique_ptrのデリータ指定(ポインタではない构造体が帰る场合)

c_cpp std :: unique_ptrでポインタがそのまま使える场合のデリータ指定(关数オブジェクト版)

一些 std::unique_ptr 使用和“陷阱”