构造对象,其中一个属性依赖于另一个属性。在C ++中

时间:2014-05-25 05:33:22

标签: c++ arrays oop constructor

  • C ++初学者

我有一节课,说

class A
{
  public:

  int N;
  double ..... 
};

但我希望.....根据N定义一个大小的矩阵。如果改变方法,它是N的不同函数而不仅仅是N本身,比如说N ^ 3 + 1。

  • 如果是方法,我从未在C ++中编写过对象的构造函数。因此,如果这是方法,请你详细说明。我不明白它是如何工作的。当班级实例化时,可能还没有对属性N进行初始化。
  • 我不清楚如何获得在执行时确定大小的矩阵或数组(我仍然不清楚C ++的基本数据类型)。

编辑: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);

3 个答案:

答案 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;