私有变量依赖于未指定的私有变量(C++)
Private variable depending on unspecified private variable (C++)
假设我有一个像这样的class:
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。我该如何实现呢?提前致谢。
您应该在构造函数中处理所有这些; 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...最好是内联或在初始化列表中。
根据您的代码,您需要分配一个动态二维数组。
这实际上是一个指向数组的指针数组。
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;
};
假设我有一个像这样的class:
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。我该如何实现呢?提前致谢。
您应该在构造函数中处理所有这些; 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...最好是内联或在初始化列表中。
根据您的代码,您需要分配一个动态二维数组。 这实际上是一个指向数组的指针数组。
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;
};