C++ 高度不是一个恒定的表达式
如何在构造函数中为2D数组分配动态内存,同时保持我的C++ 高度不是一个恒定的表达式,c++,c++11,C++,C++11,如何在构造函数中为2D数组分配动态内存,同时保持我的std::unique_ptr处理其释放?还是有更好的方法 我的错误是“高度不是一个恒定的表达式” #包括 #包括 #包括 模板 类矩阵 { 私人: int宽度、高度; std::唯一的ptr元素; 公众: 矩阵(整数宽度、整数高度); T*运算符[](整数索引); 常量T*运算符[](整数索引)常量; }; 模板 矩阵::矩阵(int-Width,int-Height):宽度(Width),高度(Height),元素(新的T[Width][H
std::unique_ptr
处理其释放?还是有更好的方法
我的错误是“高度不是一个恒定的表达式”
#包括
#包括
#包括
模板
类矩阵
{
私人:
int宽度、高度;
std::唯一的ptr元素;
公众:
矩阵(整数宽度、整数高度);
T*运算符[](整数索引);
常量T*运算符[](整数索引)常量;
};
模板
矩阵::矩阵(int-Width,int-Height):宽度(Width),高度(Height),元素(新的T[Width][Height]){}
模板
T*矩阵::运算符[](int-Index){返回元素[Index];}
int main()
{
矩阵M(4,4);
std::cout您需要使用动态数组习惯用法。分配一个一维向量并转换坐标。类似于:,元素(新的T[Width*Height])
。然后您需要在运算符[]中执行数组转换,类似于:返回元素。get()+Index*Height;
顺便说一句,您的unique\u ptr
应该是unique\u ptr
而不是T*
。如果您使用new[]
进行分配,您需要unique\u ptr
来确保使用delete[]回收它
您需要使用动态数组习惯用法。分配一个一维向量并转换坐标。类似于:,元素(新的T[Width*Height])
。然后您需要在运算符[]中执行数组转换,类似于:返回元素。get()+Index*Height;
顺便说一句,您的unique\u ptr
应该是unique\u ptr
而不是T*
。如果您使用new[]
进行分配,您需要unique\u ptr
来确保使用delete[]回收它
函数参数不能用于初始化C数组,因为它们的值在编译时不一定是已知的。另外,像您这样执行动态分配的矩阵类也不是一个好主意……我建议将维度作为矩阵类模板的一部分,类似这样
template<typename T, size_t Width, size_t Height>
class Matrix
{
private:
std::array<std::array<T, Height>, Width> Elements;
public:
Matrix() {}
std::array<T, Height> & operator[](int Index) { return Elements[Index]; }
};
函数参数不能用于初始化C数组,因为它们的值在编译时不一定是已知的。另外,像您这样执行动态分配的矩阵类也不是一个好主意…我建议将维度作为矩阵类模板的一部分,类似这样
template<typename T, size_t Width, size_t Height>
class Matrix
{
private:
std::array<std::array<T, Height>, Width> Elements;
public:
Matrix() {}
std::array<T, Height> & operator[](int Index) { return Elements[Index]; }
};
是的,但vector跟踪每一行,因此,如果用户决定调整一行大小而不调整其他行,则允许使用奇怪的矩阵。因此,我使用了普通数组:DYeah,但vector跟踪每一行,因此,如果用户决定调整一行大小而不调整其他行,则允许使用奇怪的矩阵。因此,我使用了普通数组:D
typedef Matrix<float, 2, 2> Mat2x2;
typedef Matrix<float, 3, 3> Mat3x3;