私有变量取决于未指定的私有变量(C ++)

时间:2017-08-23 15:53:58

标签: c++ class private

假设我有一个类似这样的类:

class SpinSystem{
private:
  int L;
  int L2;
  const int k=1, J=1;
  const int teq, tcorr;
  const double TC=2/log(1+sqrt(2.0));//TC=2.269;
  double Temp;
  int Nmuestras;
  int s[L][L]; int E,M; 
  int Cluster[L2][2]; int write;
public:
  void set_values(int, double, int);
};

void SpinSystem::set_values(int length, double temperature, int nsamples){
  L = length;
  Temp = temperature;
  Nmuestras = nsamples;
  L2 = length*length;
  teq = (int)(10*pow(length/8.0,0.58));
  tcorr = (int)(1*pow(length/8.0,0.58));
}

私有变量L2,teq,tcorr取决于L的值。这就是我用方法set_values设置它们的值的原因。但是,我必须定义一些数组,例如s [L] [L]和Cluster [L2] [2],其大小明显依赖于L.我怎样才能实现这一目标?提前谢谢。

2 个答案:

答案 0 :(得分:2)

你应该在构造函数中处理所有这些; init函数有各种相关的问题。并且您应该确保变量按依赖顺序列出(即,如果一个变量依赖于另一个变量,则必须首先声明后者)。而且,固定常数可以简单地变为静态,因为它们总是相同的。您不需要保留从L2等其他人那里得到的变量。尽可能内联初始化内容。

class SpinSystem{
private:
  static constexpr int k=1;
  static constexpr int J=1;
  static constexpr double TC=2/log(1+sqrt(2.0));//TC=2.269;

  int teq = (int)(10*pow(length/8.0,0.58));
  int tcorr = (int)(1*pow(length/8.0,0.58));

  int L;
  double Temp;
  int Nmuestras;

  std::vector<int> s;
  int E;
  int M;
  std::vector<int> Cluster;
  int write;
public:
  void SpinSystem(int length, double temp, int nsamples)
    : L(length)
    , Temp(temp)
    , NMmuestras(nsamples)
  {
    s.resize(L*L);
    Cluster.resize(L*L*2);
  }
};

这里我创建了相同总大小的一维数组。我强烈建议你这样做,并使用一个简单的函数来转换你需要的索引。但是如果你不喜欢它,你总是可以使用嵌套向量。

确保在实际代码中初始化E,M和Write ...最好是内联或初始化列表。

答案 1 :(得分:-1)

从代码中,您需要分配动态2D数组。 这实际上是一个指向数组的指针数组。

int _tmain(int argc, _TCHAR* argv[])
{
    int L = 10; // get from command line

    int ** s = new int*[L];
    for (int i = 0; i < L; i++)
        s[i] = new int[L];

    // DO SOMETHING

    // free memory
    for (int i = 0; i < L; i++)
        delete[] s[i];

    delete[] s;

    return 0;
};