【问题标题】:Private variable depending on unspecified private variable (C++)私有变量取决于未指定的私有变量(C++)
【发布时间】:2017-08-23 15:53:57
【问题描述】:

假设我有这样一个类:

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。我该如何实现呢?提前致谢。

【问题讨论】:

  • 您需要动态分配(和释放)内存。查看关键字 new,然后在您了解使用 unique_ptr 后不要忘记释放它。
  • 使用std::vector?
  • 我发现的最佳 SO 帖子 - stackoverflow.com/questions/936687/… 。网格解决方案非常适合保留类 C 的行为和保留线性内存空间。

标签: c++ class private


【解决方案1】:

您应该在构造函数中处理所有这些; 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...最好是内联或在初始化程序列表中。

【讨论】:

  • 为什么不将sCluster 添加到您的初始化列表中? ... , NMmuestras(nsamples), s(L*L), Cluster(L*L*2) {}
  • @Rob 我想你可以,我只是习惯了,因为调用reserve 或其他无法在构造函数中完成的事情是如此普遍。
【解决方案2】:

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

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;
};

【讨论】:

  • 你违反了 0/3/5 的规则。
  • 你是对的 - 我提供的部分代码仅用于分配二维数组。更新为非类版本。
猜你喜欢
  • 2013-06-22
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2013-08-08
  • 2011-01-08
  • 1970-01-01
相关资源
最近更新 更多