带指针的模板,创建2d数组

时间:2015-11-16 00:43:29

标签: c++

我的模板和指针有点问题。我正在尝试为不同类型的不同矩阵创建一个二维数组。我必须使用模板和引用来做到这一点。 我的主要功能看起来像这样,我不允许改变它:

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];
  }
}   

我的问题是我没有得到这个功能的解决方案。我尝试过的每一种方式都尝试过,但没有任何效果。 我认为问题是我没有使用类型**指针和type-parameter一起正确工作。在我上面发布的版本中,我得到的错误如下:

error: cannot convert ‘int****’ to ‘int**’ in assignment x = new S*[row];

如果有人可以帮我修复这个功能,我会很高兴。

2 个答案:

答案 0 :(得分:1)

reserve的签名更改为此应修复编译错误

template <typename S>
void reserve(S **&x, int row, int column)

或者,您可以实现reserve,以便它返回新分配的数组

template <typename S>
S** reserve(int row, int column)
{
    S** x = new S*[row];

    for (int i = 0; i < row; ++i) {
        x[i] = new S[column];
    }

    return x;
}

使用完成后,请记住使用delete []删除数组:)

答案 1 :(得分:0)

也许这样的事可能会对你有所帮助;尝试将整个概念封装到类对象中:

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 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.
};

然后在您的主要内容中,这将简化代码。

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

就是这样!构造函数不应该那么难实现。如果您只使用堆栈对象,则该类的第一个定义将起作用,但如果您需要所有对象的动态内存,则第二个定义将满足您的需求,并且使用智能指针可以使动态内存的清理更加清晰,更容易,更安全。不太容易发生内存泄漏。

这也允许您在创建矩阵时获得可用数据时创建矩阵;或者使一个空的矩阵容器可用于在您准备填充它时留出内存供以后使用。您只需添加必要的方法来设置,获取数据元素以及执行基本操作的任何适当的操作符重载。也许有一些公共方法可以对数据进行常规工作或测试数据是否在矩阵中等等。

因为这个Matrix类是模板的方式;它不仅仅是基本的原始日类型。这可以存储类对象,结构,函数指针,事件,线程,文件甚至更多!