Инициализация статических членов объекта - PullRequest
1 голос
/ 20 июля 2010

Статические члены иногда смущают меня.Я понимаю, как инициализировать простой встроенный тип, такой как int, с чем-то вроде int myClass::statVar = 10;, который вы помещаете в файл .cpp, но у меня есть нечто вроде следующего:

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

protected:
 static RandomGenerator itsGenerator;
}

Основная идея достаточно проста: myClass нужен доступ к генератору случайных чисел для одной из его функций-членов.Я также могу иметь только несколько экземпляров генератора, так как каждый объект довольно большой.Однако тип RandomGenerator необходимо «инициализировать», так сказать, вызовом RandomGenerator::Randomize(), что компилятор не позволит вам сделать, так как это не постоянное значение (верно?).

Так, как я могу заставить эту работу работать?

Или, возможно, мне не следует использовать статическую переменную в этом случае, и сделать это каким-то другим способом?

Ответы [ 7 ]

2 голосов
/ 20 июля 2010

Поместите его в приватное поле, выставьте статический метод доступа. В методе доступа, если элемент еще не инициализирован, инициализируйте его.

2 голосов
/ 20 июля 2010

Вы можете создать класс-оболочку, который будет содержать экземпляр RandomGenerator и вызывать RandomGenerator::Randomize в своем конструкторе.

1 голос
/ 20 июля 2010

Просто напишите функцию, которая возвращает ссылку на правильно рандомизированный RandomGenerator, и превратите его 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();
1 голос
/ 20 июля 2010

Если копируется RandomGenerator, вы можете использовать вспомогательную функцию для инициализации:

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

RandomGenerator myClass::itsGenerator = init_rg();
1 голос
/ 20 июля 2010

В таких случаях синглтоны на самом деле являются вашими друзьями, несмотря на другие свои недостатки.

0 голосов
/ 02 марта 2011

Если только myClass нужен RandomGenerator, то:

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

Имеет ли значение, если вы повторно рандомизируете генератор случайных чисел для каждого объекта? Я предполагаю, нет; -)

0 голосов
/ 20 июля 2010

Только одна функция нуждается в RandomGenerator?Вы можете сделать это следующим образом:

int myClass :: foo () {статический RandomGenerator itsGenerator = RandomGenerator :: Randomize () ...}

...