假设我有一个类似这样的类:
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.我怎样才能实现这一目标?提前谢谢。
答案 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;
};