-3

我使用 gcc 版本 4.6.3。我想实现一个函数来分配二维矩阵并初始化它们。我使用了以下代码,但我想要一个基于模板(或通用)的代码。我想要一个通用函数来同时处理 bool、float 和 double(过程在所有情况下都是相似的)。你能帮我吗,或者给我介绍一个更好的方法来分配一个二维矩阵。

void doubleAlloc2D(double ** &t, int r, int c,double initialValue=0)
{
    t=new double*[r];
    if (!t)
    {
        if (DETAILS) std::printf  ("Not enough memory.(code: 461546596551)\n");
        getchar();
        exit(-1);
    }

    for (int i=0;i<r;i++)
    {
        t[i] = new double[c];
        if (!t[i])
        {
            if (DETAILS) std::printf  ("Not enough memory.(code: 461651651)\n");
            getchar();
            exit(-1);
        }
        for (int j=0;j<c;j++)
            t[i][j] = initialValue;
    }

}
4

1 回答 1

1

您没有指定要通用的内容,但我会猜测类型(可能还有尺寸)。在 C++ 中创建对象(包括通用或非通用容器)的常用方法是将其定义为类。就像是:

template <typename T, int rows, int columns>
class Matrix
{
    std::vector<T> myData;
public:
    Matrix( T const& init = T() )
        : myData( rows * columns, init )
    {
    }
    T* operator[]( int index )
    {
        return &myData[0] + index * columns;
    }
    T const* operator[]( int index ) const
    {
        return &myData[0] + index * columns;
    }
    //  ...
};

如果您不希望行和列成为编译时常量,请将它们从模板参数中删除,然后将它们添加到构造函数参数中。并且不要忘记保存它们。

一个更复杂(但仍然不太困难)的解决方案是使用代理类作为 的返回值 operator[],而不是T*. 另一个常见的解决方案是覆盖operator()( int i, int j )索引,并使用 m( i, j )语法,而不是m[i][j].

从来没有任何理由在 C++ 中使用数组 new。C++ 不是C,你不应该尝试像它那样编程。

于 2013-07-23T14:15:51.467 回答