需要以编程方式初始化类变量数组,我该如何做到最好?

时间:2011-08-23 20:06:58

标签: c++ arrays static initialization const

在C ++中,我有一个双打数组,需要在运行时以编程方式初始化,只需一次,以便整个类共享。它们既可以是静态的也可以是常数。我如何最好地初始化它们?我已经开始使用静态功能,目前普遍使用的是并行处理器。所以我必须设置一个标志来运行一次,或者是否有一些静态const魔法将它们初始化为函数本地变量(ok)或类(ok)?

    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的double,这样我就可以在不迭代NUMTRACES的情况下检索它们。

_ 修改 _ 没关系,这就是构造函数的用途:) 只是希望能够将我的静态,const和初始化的gremlins解决成讨价还价。谢谢塞思

_ 修改 _ 不确定它是否是我想要的效果。构造函数在每个实例上运行,即使成员是静态的,不是吗?不,Lemme看......

_ 修改 _ 我认为最有效的解决方案是在构造函数中使用静态标志来保护初始化器循环。作为一个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:错误LNK2020:未解析的令牌(0A00001C)“private:static double * mens:meclass :: PIMPL :: WEIGHTATI”(?WEIGHTATI @ PIMPL @ meclass @ mens @@ $$ Q0PANA)   meobj.obj:错误LNK2001:未解析的外部符号“private:static double * 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;
    }
}

2 个答案:

答案 0 :(得分:2)

初始化=&gt;构造函数。一旦=&gt;静态实例。所以一种方法是使用构造函数的静态实例。

#include <iostream>

struct Foo
{
    Foo()
    {
        std::cout << "Initializing them values..." << std::endl;
        for( int i = 0;  i < 3;  ++i )
        {
            values[i] = i;
        }
    };

    int values[3];
};

void doThings()
{
    static Foo const    foo;        // Is initialized ONCE.

    for( int i = 0;  i < 3;  ++i )
    {
        std::cout << foo.values[i] << " ";
    }
    std::cout << std::endl;
}

int main()
{
    doThings();
    doThings();
    doThings();
}

干杯&amp;第h。,

答案 1 :(得分:1)

您可以在构造函数中放置static bool标志。该标志仅在第一次被调用时被初始化为false。之后它仍然是真的。

// foo.h

class Foo {
  static const int MIDTRACE = 3; // static const, no definition needed
  static const int NUMTRACES = 2 * MIDTRACE + 1; // static const, no definition needed
  static double WEIGHTATI[NUMTRACES]; // not const, so need definition outside of class
public:
  Foo() {
    static bool array_initialized = false;
    if( !array_initialized ) {
      // Initialize array
      array_initialized = true;
    }
  }
  // Other members
};

在源文件中,不是头文件:

// foo.cpp
include "foo.h"
double Foo::WEIGHTATI[NUMTRACES];