Вопрос таков: есть такой класс (файл 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))
Подскажите, где я должен это прописать?
Так не годится?
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().
На вашем месте я бы использовал ленивую инициализацию:
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 будет вызвана раньше.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей