Initialization of object static members

2019-03-02 03:35发布

问题:

Static members confuse me sometimes. I understand how to initialize a simple built in type such as int with something along the lines of int myClass::statVar = 10;, which you place in a .cpp file, but I have something of the following sort:

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

protected:
 static RandomGenerator itsGenerator;
}

The basic idea is simple enough: myClass needs access to a random generator for one of its member functions. I also can have only a few instances of the generator since each object is quite big. However, the RandomGenerator type needs to be "initialized", so to speak, by a call to RandomGenerator::Randomize(), which the compiler won't allow you to do since it's not a const rvalue (is that right?).

So how can I make this work?

Or perhaps should I not make use of a static variable in this case, and do it some other way?

回答1:

You could create wrapper class which will hold RandomGenerator instance in it and will call RandomGenerator::Randomize in its constructor.



回答2:

Put it in a private field, expose a static accessor. In the accessor, if the member is not yet initialized, initialize it.



回答3:

In cases such as these, singletons actually are your friends, despite their other drawbacks.



回答4:

If RandomGenerator is copyable, you can use a helper function for initialization:

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

RandomGenerator myClass::itsGenerator = init_rg();


回答5:

Just write a function which returns a reference to a properly randomized RandomGenerator and turn itsGenerator into a reference to a generator:

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();


回答6:

Is it only a one function that needs RandomGenerator? You may do this in this way:

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



回答7:

If only myClass needs the RandomGenerator, then:

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

Does it matter if you re-randomize your random generator for each object? I'm assuming no ;-)