Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带指针的模板,创建二维数组_C++ - Fatal编程技术网

C++ 带指针的模板,创建二维数组

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);

我对模板和指针有点小问题。我正在尝试为一些不同类型的矩阵创建一个2d数组。我必须在有意义的地方使用模板和引用。 我的主要功能如下所示,不允许我更改:

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,…)