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?
You could create wrapper class which will hold RandomGenerator
instance in it and will call RandomGenerator::Randomize
in its constructor.
Put it in a private field, expose a static accessor. In the accessor, if the member is not yet initialized, initialize it.
In cases such as these, singletons actually are your friends, despite their other drawbacks.
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();
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();
Is it only a one function that needs RandomGenerator? You may do this in this way:
int myClass::foo()
{
static RandomGenerator itsGenerator = RandomGenerator::Randomize()
...
}
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 ;-)