我创建了以下问题(现在)将计算行列式或矩阵。(我将扩展它,这就是我输入维度和矩阵的原因)。
EDITED --->>>问题仍然存在:
错误:'mat'未在此范围内声明
#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;}
答案 0 :(得分:0)
您要做的是将mat
初始化为动态大小的数组。正如您的编译器告诉您的那样,这不能在常量表达式中完成。
您必须为matrix
类编写构造函数,该构造函数将rows
作为参数并包含mat=new int *[rows]
行。请注意,您还需要初始化 mat
的每个行;你的allocate
方法执行此操作,应该从构造函数中调用。
答案 1 :(得分:0)
new
运算符动态分配内存(即,从免费存储中)。因此,它应该是任何成员函数的一部分,在此示例中将其返回地址分配给成员变量,而不是类声明的部分。它可以是getdata()
成员函数的一部分。
而且,class需要析构函数,因为它正在管理资源。
修改1:
问题 -
int **mat=new int *[rows];
,是参数化构造函数中的局部变量,一旦调用构造函数完成引发内存泄漏,就会超出范围。
使用语句matrix a;
,将调用默认构造函数。即matrix::matrix()
,没有参数的构造函数。但是,您正在参数化构造函数中进行初始化。
为了让一切正常,试试这个 -
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()
};
希望它有所帮助!
答案 2 :(得分:0)
看到矩阵的大小可变,并且矩阵数据将在堆中,您需要在构造函数中初始化矩阵数据或通过延迟实例化。我以前回答过创建矩阵的问题。这是它的link。如果您查看那里,您可以观察到在矩阵的大小已知之前未初始化数据,并且在您的情况下,它是在堆内存中创建的。
编辑:C ++在声明时不允许在堆中初始化成员变量。在您的情况下,首先不知道使用正确大小的内存创建mat
矩阵的大小。正如这里的每个人所提到的,使用构造函数来创建mat
实例。
答案 3 :(得分:0)
mat
的初始化属于构造函数,比如说
matrix::matrix(int _rows, int _columns)
: rows(_rows)
, columns(_columns)
, mat(new int *[rows])
{
for (int r = 0; r < rows; ++r)
mat[r] = new int[columns];
}
不要忘记析构函数:
matrix::~matrix()
{
for (int r = 0; r < rows; ++r)
delete[] mat[r];
delete[] mat;
}
话虽如此,我强烈反对发明另一个“我自己的矩阵类库”。使用有效且已建立的内容,例如Eigen。
另外,对于容器,除非你有充分的理由,否则请使用一些好的类库。例如。标准库std::vector
等等,或者(根据我的口味更好):Qt类,如QVector。
答案 4 :(得分:0)
立即提问:
mat
似乎是构造函数中的局部变量,而不是类成员
i
和j
是在fill()
但未determinant()
还有其他主要问题:
您的矩阵未初始化rows
或columns
。这些将具有任意随机值,并且考虑到它们是有符号的整数,甚至可能是负数。您的构造函数可能会抛出bad_alloc
填写什么?
这不是获得行列式的正确公式,无论如何只适用于平方矩阵
你最好使用矢量而不是数组而只使用一个矢量。查看C++ FAQ以查看制作矩阵的最简单方法。
假设你确实希望它是int而不是double的矩阵,用这种方式声明“mat”:
std::vector<int> mat;
你的构造函数应该是这样的:
matrix::matrix (int r,int c) :
rows(r), columns(c), mat(r*c)
{
//body
}
重载运算符[]因此:
int* operator[](int r)
{
return &mat[r*columns];
}
const int* operator[](int r) const
{
return &mat[r*columns];
}
注意我们有2个。可以根据另一个实现一个。有些人还想重载operator()来获取2个参数,即行和列,但上面的方法都可以。
对于维度,您可能更喜欢使用size_t而不是int。