首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++矩阵计算

c++矩阵计算
EN

Stack Overflow用户
提问于 2011-02-28 12:30:25
回答 5查看 2.6K关注 0票数 2

我创建了下面的问题(现在),它将计算行列式或矩阵。(我将展开它,这就是我输入维数和矩阵的原因)。

编辑

  • 它不承认我的函数中的变量"mat“。

错误:“mat”未在此范围内声明

代码语言:javascript
复制
 #include <iostream>
 #include <cstdio>
 #include <cstdlib> 
 #include <cmath>

using namespace std;

class matrix {
private:
int rows,columns;

public:
//constructor
matrix ()
{}
matrix(int _rows,int _columns) : rows(_rows),columns(_columns){
{
 int **mat=new int *[rows];
    for (int r = 0; r < rows; ++r)
        mat[r] = new int[columns];
}

}
//destructor
~matrix(){
for (int r = 0; r < rows; ++r)
        delete[] mat[r];
    delete[] mat;

}

//void allocate();
void getdata() {

cout <<"Enter number of rows :"<<endl;
cin >>rows;
cout <<"Enter number of columns : "<<endl;
cin >> columns;

}
void fill();
double determinant();
void showdata(){

}

};



int main()
{
matrix a;

a.getdata();
a.fill();
a.determinant();

    return 0;
}



//fills the matrix
void matrix ::fill(){

    for(int i=0;i<rows;i++) {
        for(int j=0;j<columns;j++){
        cout <<"Enter the elements in a line separated by whitespace :"<<endl;
        cin >>mat[i][j];
        }
    }

}
//calculate the determinant
double matrix :: determinant (){
    double det;
    det = mat[rows][columns]*mat[rows+1][columns+1] - mat[rows][columns+1]*mat[rows+1][columns];
    cout <<"The determinant of matrix is :"<<det<<endl;}
EN

回答 5

Stack Overflow用户

发布于 2011-02-28 12:35:16

您要做的是将mat初始化为一个动态大小的数组。这不能像编译器告诉您的那样在常量表达式中完成。

您必须为matrix类编写一个构造函数,该构造函数将以rows作为参数并包含mat=new int *[rows]行。注意,您还需要初始化mat的每一行;您的allocate方法就是这样做的,应该从构造函数中调用。

票数 0
EN

Stack Overflow用户

发布于 2011-02-28 12:40:08

new操作符动态地分配内存(即从空闲存储)。因此,在本例中将其返回地址分配给成员变量应该是任何成员函数的一部分,而不是类声明的一部分。它可以是getdata()成员函数的一部分。

而且,类需要一个析构函数,因为它正在管理资源。

编辑1 :

问题-

  1. int **mat=new int *[rows];,是参数化构造函数中的一个局部变量,一旦调用该构造函数就超出了作用域,从而引发内存泄漏。
  2. 使用语句matrix a;,将调用默认构造函数。即,matrix::matrix(),没有参数的构造函数。但是,您正在参数化构造函数中进行初始化。

为了让一切正常运转,试试这个-

代码语言:javascript
复制
class matrix
{
    int **mat;
    // ...

    public:
    matrix()
    {
        cout <<"Enter number of rows :"<<endl;
        cin >>rows;
        cout <<"Enter number of columns : "<<endl;
        cin >> columns;

        mat=new int *[rows];
        for (int i=0;i<rows;i++) {
            mat[i]=new int [columns];
        }
    }

    // And no more, getdata() member function is required. Avoid it's call in main()
};

希望能帮上忙!

票数 0
EN

Stack Overflow用户

发布于 2011-02-28 12:40:16

考虑到您的矩阵有可变大小,并且您的矩阵数据将在堆中,您必须在构造函数中或通过延迟实例化来初始化矩阵数据。我以前曾回答过一个关于创建矩阵的问题。这是给它的链接。如果您查看这里,您可以观察到,在已知矩阵的大小之前,没有初始化数据,就像在您的例子中一样,数据是在堆内存中创建的。

编辑:C++不允许在声明成员变量时初始化堆中的成员变量。在您的例子中,矩阵的大小首先是不知道的,因为要用正确的内存大小来创建mat。正如这里的每个人所提到的,使用构造函数来创建mat实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5141989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档