C ++ Scope问题:创建矩阵类而不浪费空间

时间:2014-05-25 14:48:47

标签: c++ class scope

这是一个困扰我的小班:

class matrix{
    string name;
    int rowSize, columnSize;
    // I could declare double m[100][100]; here but that would be ugly
    public:
    void createMat(){
        cout << "Enter Matrix Name:"; 
        cin >> name;
        cout << "Enter number of rows: "; 
        cin >> rowSize;
        cout << "Enter no. of columns: "; 
        cin >> columnSize; 
        double m[rowSize][columnSize]; //needs to be available to readMat()
        cout << "Enter matrix (row wise):\n";
        for(int i = 0; i < rowSize; i++){
            for(int j = 0; j < columnSize; j++){cin >> m[i][j];}
            cout<<'\n';
        }
    }
    void readMat(){
        cout << "Matrix " << name << " :\n";
        for(int i = 0 ; i < rowSize; i++){
        for(int j = 0; j < columnSize; j++){ cout << m[i][j] << ' ';}
        cout<<'\n';
        }
    }
};

如何以最佳方式向mcreateMat()提供readMat()

是否试图让用户输入不必要的矩阵尺寸?

从我的观点来看,我觉得我定义矩阵的最大尺寸会在需要更多元素的情况下限制太多,或者如果没有那么多的元素则需要太多。

3 个答案:

答案 0 :(得分:1)

您应该使用动态大小的内存块,并在用户输入的基础上在运行时分配它。在这里,我使用std::vector

class matrix{
    std::string name;
    int rowSize, columnSize;
    std::vector<double> m;
    public:
    void createMat(){
        std::cout << "Enter Matrix Name:"; 
        std::cin >> name;
        std::cout << "Enter number of rows: "; 
        std::cin >> rowSize;
        std::cout << "Enter no. of columns: "; 
        std::cin >> columnSize; 
        m.resize(rowSize*columnSize);
        std::cout << "Enter matrix (row wise):\n";
        for(int i = 0; i < rowSize; i++){
            for(int j = 0; j < columnSize; j++){
                std::cin >> m[i*columnSize+j];
            }
            std::cout<<'\n';
        }
    }
    void readMat() {
        std::cout << "Matrix " << name << " :\n";
        for(int i = 0 ; i < rowSize; i++){
            for(int j = 0; j < columnSize; j++) {
                std::cout << m[i*columnSize+j] << ' ';
            }
            std::cout<<'\n';
        }
    }
};

答案 1 :(得分:1)

我对你问题的回答是:

  1. 让它成为一个班级成员(听起来很明显,但你期望得到什么样的答案?)
  2. 最有可能让用户设置矩阵大小......但这实际上取决于你需要的东西。
  3. 我会做一些不同的事情,特别是:

    • 而不是createMat()我会使用类构造函数来执行初始化工作(由于这个原因,存在构造函数)。

    • 然后我会将元素存储在private 1D数组element[rowSize*columnSize]中(在构造函数中动态分配)。

    • 然后我会创建void setElement(i,j)double getElement(i,j)方法。

    (考虑查看EIGEN库,一个非常灵活且易于使用的线性代数库,具有类似Matlab的风格)

答案 2 :(得分:0)

您需要将m定义为类成员并进行动态内存分配。

class matrix{
    string name;
    int rowSize, columnSize;
    double **m;

    void createMat(){
       m = new double*[rowSize];
       for(int i = 0; i < rowSize; ++i)
          m[i] = new double[columnSize];

    }
 }

这是一个详细的教程:http://www.cs.umb.edu/~mweiss/cs410_f04/ppts/cs410-7.pdf