构造一个空矩阵

时间:2014-12-04 01:44:31

标签: c++ matrix multidimensional-array

我有一个班级

class A
{
    int *const e;
    const int row, column;
public:
    A(int r, int c); // create a empty matrix with r rows and c columns passed in method
}

int main(int argc, char* argv[])
{
    A test(2,2); 
    return 0;
}

问题是如何编写一个构造函数来创建一个我可以使用的矩阵?

4 个答案:

答案 0 :(得分:1)

你的构造函数只是

A::A(int r, int c) : row{r}, column{c}
{
    e = new int[r * c];
}

那么你的析构函数应该是

A::~A()
{
    delete[] e;
}

您可以访问元素

for (int i = 0; i < row; ++i)
{
    for (int j = 0; j < column; ++j)
    {
        std::cout << e[i * row + j] << " ";  // Using array arithmetic
    }
    std::cout << std::endl;
}

答案 1 :(得分:0)

您的问题听起来像: 如何将参数保存到常量行/列属性中。

A::A(int r, int c): row(r), column(c), e(new int[r*c])
{
    for (int i=0; i<r*c; i++) e[i]=0;
}

也不要忘记析构函数:

virtual ~A(){ delete[] e; };

在构造函数的参数列表中,参数按声明顺序初始化,因此您不能使用行/列(它们尚未初始化)。

答案 2 :(得分:0)

您需要一个指向指针的指针来创建[普通]二维数组 所以

int ** const e;

然后构造函数可以像:

一样工作
e = (int**) malloc(sizeof(int**) * a);
for(int i=0;i<a;++i) {
  e[i] = (int*) malloc(sizeof(int*) * b);
}

你的下一个问题是“如何初始化常量”。为此,您可以参考这里的答案: how to initialize const member variable in a class C++

实现这一点,将inittializer代码放在一个函数中:

initConstArray(const int** const a, int r, int  c) {
    e = (int**) malloc(sizeof(int**) * a);
    for(int i=0;i<r;++i) {
      e[i] = (int*) malloc(sizeof(int*) * b);
      for(int j = 0;j < c; ++j) {
        e[i][j] = a[i][j];
    }

并从构造函数初始化列表中调用此函数:

A(int **a, int r, int c) : initConstArray(a, r, c) {
}

答案 3 :(得分:0)

以下是使用模板实现矩阵的另一种方法:

#include <array>
#include <iostream>

template <std::size_t ROW, std::size_t COLUMN>
class A
{
    std::array<int, ROW*COLUMN> a;
public:
    A():a(){};
};


int main(int argc, char* argv[])
{
    A<3,3> test; 
    //test.printSize();
    //std::cout << test;
    return 0;
}

更短更清洁。

要使注释行有效,您必须向该类添加以下两个函数:

void printSize(){ std::cout << ROW << "x" << COLUMN << std::endl; };

friend std::ostream& operator<<( std::ostream& os, A<R,C> mat){
    int col_count = 0;
    for (auto id=mat.a.begin(); id!=mat.a.end(); id++){
        os << *id << (++col_count%C==0?"\n":" ");
    }

    return os;
};