C++ 带指针的模板,创建二维数组
我对模板和指针有点小问题。我正在尝试为一些不同类型的矩阵创建一个2d数组。我必须在有意义的地方使用模板和引用。 我的主要功能如下所示,不允许我更改:C++ 带指针的模板,创建二维数组,c++,C++,我对模板和指针有点小问题。我正在尝试为一些不同类型的矩阵创建一个2d数组。我必须在有意义的地方使用模板和引用。 我的主要功能如下所示,不允许我更改: int main(){ int row, column; cin >> row; cin >> column; int** M1; double** M2; reserve(M1, row, column); reserve(M2, row, column);
int main(){
int row, column;
cin >> row;
cin >> column;
int** M1;
double** M2;
reserve(M1, row, column);
reserve(M2, row, column);
return 0;
}
所以我的储备函数应该是这样的:
template <typename S>
void reserve(S &x, int row, int column){
x = new S*[row];
for(int i = 0; i < row; ++i) {
x[i] = new S[column];
}
}
template<typename T>
class Matrix {
public:
typedef std::vector<T> Row;
private:
std::vector<Row> Mat;
unsigned numberRows;
unsigned numberColumns;
public:
Matrix();
explicit Matrix( std::vector<Row>& vRows );
Matrix( unsigned numRows, unsigned numColumns );
Matrix( unsigned numRows, unsigned numColumns, T** data );
~Matrix();
private:
void reserve( unsigned int numRows, unsigned int numColumns );
};
如果有人能帮我修复此函数,我将不胜感激。将
reserve
的签名更改为此应该可以修复编译错误
template <typename S>
void reserve(S **&x, int row, int column)
记住在使用完数组后,使用
delete[]
删除它:)这样的方法可能会对您有所帮助;尝试将整个概念封装到一个类对象中,如下所示:
template <typename S>
void reserve(S &x, int row, int column){
x = new S*[row];
for(int i = 0; i < row; ++i) {
x[i] = new S[column];
}
}
template<typename T>
class Matrix {
public:
typedef std::vector<T> Row;
private:
std::vector<Row> Mat;
unsigned numberRows;
unsigned numberColumns;
public:
Matrix();
explicit Matrix( std::vector<Row>& vRows );
Matrix( unsigned numRows, unsigned numColumns );
Matrix( unsigned numRows, unsigned numColumns, T** data );
~Matrix();
private:
void reserve( unsigned int numRows, unsigned int numColumns );
};
模板
类矩阵{
公众:
typedef std::向量行;
私人:
std::向量矩阵;
无符号数字箭头;
无符号数字列;
公众:
矩阵();
显式矩阵(std::vector&vRows);
矩阵(无符号numRows、无符号numcolumn);
矩阵(无符号numRows、无符号numcolumn、T**data);
~Matrix();
私人:
无效保留(未签名整数行、未签名整数列);
};
其中,此reserve()方法是类对象的一部分,只有该类可以访问它。这将作为类实现其多个构造函数的助手函数。如果要为元素使用动态内存,可以将其扩展为:
template<typename T>
class Matrix {
public:
typedef std::vector<std::shared_ptr<T>> Row;
private:
std::vector<Row> Mat;
// All Else Would Be The Same; Only The Internal Methods Would Slightly
// Vary Due To The Use Of Smart Pointer And Dynamic Memory.
};
模板
类矩阵{
公众:
typedef std::向量行;
私人:
std::向量矩阵;
//所有其他方法都是一样的;只有内部方法会稍微改变
//因使用智能指针和动态内存而有所不同。
};
然后,在您的主要任务中,这将简化代码
int main() {
// Using Default Constructor
Matrix<float> fMat1;
// Using std::vector<Row> To Construct A Matrix
Matrix<int>::Row row1;
Matrix<int>::Row row2;
Matrix<int>::Row row3;
std::vector<Matrix<int>::Row> vRows
Matrix<int> iMat2( vRows );
// A Construct That Knows The Size Of The Matrix;
// But Doesn't Have The Data
Matrix<double> dMat3( 4, 4 ); // This Will Create A Size Of 4x4 Of
// Doubles And Initialize Everything To 0
// Same As Above, But Passing In Raw Data By Double Pointer.
float** pData = nullptr;
// Populate Pointer's Elements
unsigned int row, col;
// Store Size Of Row & Col Based On Pointer's Elements
Matrix<float>( row, col, pData );
return 0;
}
intmain(){
//使用默认构造函数
基质fMat1;
//使用std::vector构造矩阵
矩阵::行row1;
矩阵::第2行;
矩阵::第3行;
向量向量
矩阵iMat2(vRows);
//知道矩阵大小的构造;
//但是没有数据
矩阵dMat3(4,4);//这将创建4x4的
//将所有值加倍并初始化为0
//同上,但通过双指针传入原始数据。
浮点**pData=nullptr;
//填充指针的元素
无符号整数行,列;
//根据指针的元素存储行和列的大小
矩阵(行、列、pData);
返回0;
}
就这样!构造函数不应该那么难实现。如果您只使用堆栈对象,则类的第一个定义将起作用,但如果您需要所有对象的动态内存,则第二个定义将满足您的需要,并且使用智能指针使动态内存的清理更干净、更容易和更安全。不易发生内存泄漏
这也将允许您在创建矩阵时有可用数据时创建矩阵;或者使空矩阵容器可用,以便在以后准备填充时留出内存。您只需添加必要的方法来设置、获取数据元素,以及执行基本操作所需的任何适当的运算符重载。也许有一些公共方法可以对数据进行公共处理,或者测试数据是否在矩阵中,等等
因为这个矩阵类是模板类;它不仅仅受基本的原始日类型的约束。这可以存储类对象、结构、函数指针、事件、线程、文件等等 考虑模板无效保留(S**&x,…)
。