对象静态成员的初始化

时间:2010-07-20 10:01:34

标签: c++ class static global-variables

静态成员有时会让我感到困惑。我理解如何初始化一个简单的内置类型,例如int,其中包含int myClass::statVar = 10;的内容,您将其放在.cpp文件中,但我有以下几种类型的内容:

class myClass
{
public:
 // Some methods...

protected:
 static RandomGenerator itsGenerator;
}

基本思想很简单:myClass需要访问其成员函数之一的随机生成器。我也只能生成几个生成器实例,因为每个对象都很大。但是,RandomGenerator类型需要“初始化”,可以这么说,通过调用RandomGenerator::Randomize(),编译器不允许你这样做,因为它不是一个常量值(是正确的) ?)。

那么我怎样才能做到这一点?

或许在这种情况下我不应该使用静态变量,并以其他方式做到这一点?

7 个答案:

答案 0 :(得分:2)

你可以创建一个包装类,它将在其中保存RandomGenerator个实例,并在其构造函数中调用RandomGenerator::Randomize

答案 1 :(得分:2)

将其放在私有字段中,公开静态访问器。在访问器中,如果该成员尚未初始化,则将其初始化。

答案 2 :(得分:1)

在这些情况下,单身实际上是你的朋友,尽管他们有其他缺点。

答案 3 :(得分:1)

如果RandomGenerator是可复制的,则可以使用辅助函数进行初始化:

RandomGenerator init_rg() {
    RandomGenerator rg;
    rg.Randomize();
    return rg;
}

RandomGenerator myClass::itsGenerator = init_rg();

答案 4 :(得分:1)

只需编写一个函数,该函数返回对正确随机化的RandomGenerator的引用,并将itsGenerator转换为对生成器的引用:

class myClass
{
public:
 // Some methods...

protected:
 // make this a reference to the real generator
 static RandomGenerator& itsGenerator;
public:
 static RandomGenerator& make_a_generator() 
 {
   RandomGenerator *g=0;
    g=new RandomGenerator();
    g->Randomize();
   return *g;
 }
}

RandomGenerator& myClass::itsGenerator=myClass::make_a_generator();

答案 5 :(得分:0)

它只是一个需要RandomGenerator的函数吗?你可以这样做:

int myClass :: foo() {     static RandomGenerator itsGenerator = RandomGenerator :: Randomize()     ... }

答案 6 :(得分:0)

如果只有myClass需要RandomGenerator,那么:

myClass::myClass()
{
    itsGenerator.Randomize();
}

如果为每个对象重新随机化随机生成器,这有关系吗?我假设没有; - )