我有一节课,说
class A
{
public:
int N;
double .....
};
但我希望.....根据N定义一个大小的矩阵。如果改变方法,它是N的不同函数而不仅仅是N本身,比如说N ^ 3 + 1。
编辑:N的值稍后在代码中确定。它类似于:
A InstanceOfA; //The variable InstanceOfA is declared of type A.
...
Some other stuff happens, e.g. other properties of InstanceOfA are initialized
and some of the functions are used. And then:
...
A.setN(4);
我从下面的答案中不明白。我需要做吗
A InstanceOfA(4);
答案 0 :(得分:2)
您可以使用std::vector
class A
{
public:
int N; // you should use int for size
double std::vector<std::vector<double>> matrix; //define the matrix
//initialize it in the constructor
A( int size ):N(size), matrix(size*3+3)// or you can use any expression that evaluates an integral value
{
//you can initialize the values in matrix here
}
};
注意强>
表达式matrix(size*3+3)
初始化矩阵,使size*3+3
行,每行中的列数尚未指定。您还可以在构造函数中指定列大小,如
for( int i=0;i< N*3+3; ++i) //for each row
{
matrix[i].resize(N*2);// resize each col to hold N*2 cells,
}
修改强>
根据相关修改,您可以将构造函数留空(或初始化任何其他成员),并在类setSize
中提供A
方法,稍后将初始化大小。< / p>
void setSize(int size){
N= size;
matrix.resize( size*3+3);
for( int i=0;i< N*3+3; ++i) //for each row
{
matrix[i].resize(N*2);// resize each col to hold N*2 cells,
}
}
然后你就可以使用它:
A instanceOfA;
//other code
//
instanceOfA.setSize(N);
答案 1 :(得分:1)
您可以使用std::vector<std::vector<double>>
来捕获矩阵。另外,将N
的类型更改为int
。
class A
{
public:
int N;
std::vector<std::vector<double>> matrix;
};
定义构造函数并初始化构造函数中的数据。
class A
{
public:
A(int n) : N(n)
{
int matrixSize = N*N*N+1;
for (int i = 0; i < matrixSize; ++i )
{
matrix.push_back(std::vecotr<double>(matrixSize));
}
}
double N;
std::vector<std::vector<double>> matrix;
};
答案 2 :(得分:1)
一种可能的方法是使用指针。如果只在构造函数中分配数组,并且在对象的生命周期内它的大小不会改变,那么可以这样做:
class A
{
public:
double N;
double* arr;
A(double aN):N(aN)
{ arr = new double[3*N+1]; // allocate your array in constructor
... // do whatever else you need to initialize your object
}
...
~A() { delete[] arr;} // free it in destructor
...
}
另见Dynamic Memory上的教程。
然后,您将通过以下两种方式之一实例化您的课程:
A a(aN);
//当此对象超出范围时将自动销毁,例如在创建它的函数末尾
A* a = new A(aN);
//当不再需要此对象时,必须自行删除该对象:
...
delete a;
如果您在创建对象时不知道N,则可以推迟分配:
class A
{
public:
double N;
double* arr = NULL;
A() { ... } // do whatever you need in your constructor
setN(double aN)
{
N = aN;
arr = new double[3*N+1]; // allocate your array
}
...
~A() { if(arr) delete[] arr;} // free your array in destructor if needed
...
}
然后您可以将对象称为:
A a;