C++. Случайные числа для инициализации приватной статической переменной.

241
27 августа 2017, 05:00

Вопрос таков: есть такой класс (файл Network.h)

class Network
{
  static Nodes nodes;
  static Relations relations;
};

Мне требуется инициализировать сразу и nodes, и relations. В файле Network.cpp я прописываю следующее:

Nodes Network::nodes = {
       Node(0),Node(1),
       Node(2),Node(3),
       Node(4),Node(5)
};
Relations Network::relations = 
{
       Relation(0,3, rand() % 10 - 5),
       Relation(1,3, rand() % 10 - 5),
       Relation(2,3, rand() % 10 - 5),
       Relation(0,4, rand() % 10 - 5),
       Relation(1,4, rand() % 10 - 5),
       Relation(2,4, rand() % 10 - 5),
       Relation(3,5, rand() % 10 - 5),
       Relation(4,5, rand() % 10 - 5)
};

Проблема в том, что требуется прописать

 srand(time(nullptr)) 

Подскажите, где я должен это прописать?

Answer 1

Так не годится?

Relations Network::relations = 
{
       (srand(time(0)),Relation(0,3, rand() % 10 - 5)),
       Relation(1,3, rand() % 10 - 5),
       Relation(2,3, rand() % 10 - 5),
       Relation(0,4, rand() % 10 - 5),
       Relation(1,4, rand() % 10 - 5),
       Relation(2,4, rand() % 10 - 5),
       Relation(3,5, rand() % 10 - 5),
       Relation(4,5, rand() % 10 - 5)
};

Но я не уверен, что это идеальное и переносимое решение. Хотелось бы от гуру стандартов услышать, точно ли инициализаторы вычисляются в порядке слева направо?

Еще вариант - в конструкторе Relation статический объект вспомогательного класса, в конструкторе которого вызывается srand().

Answer 2

На вашем месте я бы использовал ленивую инициализацию:

class Network{
    static Relations& relations(){
        static Relations relations = {
           Relation(0,3, rand() % 10 - 5),
           //...
           Relation(4,5, rand() % 10 - 5)
        };
        return relations;
    }
};
int main(){
    srand(time(nullptr)) 
}

Локальная переменная relations проинициализируется при первом обращении к ней. Таким образом можно быть уверенным что функция srand будет вызвана раньше.

READ ALSO
Visual Studio 2017 не видит инклюды

Visual Studio 2017 не видит инклюды

Visual Studio 2017 не видит заголовочные файлы Windowsh, WinSock2

482
Stack overflow в рекурсивной функции(c++)

Stack overflow в рекурсивной функции(c++)

Пишу сапёра на с++Для хранения клеток использую двумерный динамический массив(позже планирую пользовательский ввод размера поля)

458
Массив из булевых переменных

Массив из булевых переменных

Я хочу сделать так, что бы некоторый набор элементов в массиве при запуске имел значение trueВ дальнейшем, когда пользователь занимает какую...

454