【发布时间】:2011-08-23 20:06:58
【问题描述】:
在 C++ 中,我有一个双精度数组,需要在运行时以编程方式初始化一次,以便整个班级共享。它们既可以是静态的,也可以是恒定的。我怎样才能最好地初始化它们?随着并行处理器的普及,我已经开始使用静态了。那么我是否必须设置一个标志来运行一次,或者是否有一些静态 const 魔法将它们初始化为函数(好的)或类(也可以)的局部变量?
double sumOfWeights = 0.0;
double fracObs = 0.0;
for (int i = 0; i < NUMTRACES; i++) {
double weightAtI = SQUARED(1 - SQUARED(MAXTRACEWRTMIDTRACE * (MIDTRACE - i)
/ double(MIDTRACE)));
sumOfWeights += weightAtI;
fracObs += obsArray[i] * weightAtI;
}
return fracObs / sumOfWeights;
在上面的代码中,我想对 weightAtI 进行查找,每个双精度都已经除以 sumOfWeights,这样我就可以在不遍历 NUMTRACES 的情况下检索它们。
_编辑_ 没关系,这就是构造函数的用途:) 只是希望解决我的静态、常量和初始化问题。谢谢赛斯
_编辑_ 不确定这是否是我想要的效果。构造函数在每个实例上运行,即使成员是静态的,不是吗?不,让我看看...
_编辑_ 我认为最有效的解决方案是在构造函数中用静态标志保护初始化循环。作为一个 POD 标志,我确信它的行为应该是适当的,我只是不太确定现阶段是什么。
_编辑_ 啊,明白了:
class X
{
public:
static int i;
};
int X::i = 0; // definition outside class declaration
_编辑_ 不幸的是,当涉及到我的代码时,
static const int MIDTRACE = 3;
static const int NUMTRACES = 2 * MIDTRACE + 1;
static double WEIGHTATI[NUMTRACES];
我收到链接器错误:
meobj.obj : error LNK2020: unresolved token (0A00001C) "private: static double * mens:meclass::PIMPL::WEIGHTATI" (?WEIGHTATI@PIMPL@meclass@mens@@$$Q0PANA) meobj.obj:错误 LNK2001:无法解析的外部符号“私有:静态双精度 * mens:meclass::PIMPL::WEIGHTATI”(?WEIGHTATI@PIMPL@meclass@mens@@$$Q0PANA)
由于我的构造函数:
meclass::PIMPL() {
if (!doneStaticInit) {
double sumOfWeights = 0.0;
for (int i = 0; i < NUMTRACES; i++) {
WEIGHTATI[i] = SQUARED(1 - SQUARED(MAXTRACEWRTMIDTRACE * (MIDTRACE - i) / double(MIDTRACE)));
sumOfWeights += WEIGHTATI[i];
}
for (int i = 0; i < NUMTRACES; i++) WEIGHTATI[i] /= sumOfWeights;
doneStaticInit = true;
}
}
【问题讨论】:
-
似乎是显式的并且没有以编程方式初始化。
-
+1 是因为并行处理器的惊人普及目前普遍存在。
-
目前流行的并行处理器数量惊人?!请告诉我你是故意写的!
标签: c++ arrays static initialization constants