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 使用和“陷阱”