Используйте условный оператор. Если выражение больше, используйте функцию
class MyClass {
public:
MemberClass m_class;
MyClass(int xyz) : m_class(xyz == 42 ? 12 : 32) {
}
};
class MyClass {
static int classInit(int n) { ... }
public:
MemberClass m_class;
MyClass(int xyz) : m_class(classInit(xyz)) {
}
};
Чтобы вызвать функцию до инициализации m_class, вы можете поместить структуру перед этим членом и использовать RAII
class MyClass {
static int classInit(int n) { ... }
struct EnvironmentInitializer {
EnvironmentInitializer() {
do_something();
}
} env_initializer;
public:
MemberClass m_class;
MyClass(int xyz) : m_class(classInit(xyz)) {
}
};
Это вызовет do_something()
перед инициализацией m_class
. Обратите внимание, что вы не можете вызывать нестатические функции-члены MyClass
до завершения списка инициализатора конструктора. Функция должна быть членом своего базового класса, и ctor базового класса должен быть уже завершен, чтобы это работало.
Также обратите внимание, что функция, конечно, всегда вызывается для каждого отдельного созданного объекта, а не только для первого созданного объекта. Если вы хотите это сделать, вы можете создать статическую переменную в конструкторе инициализатора:
class MyClass {
static int classInit(int n) { ... }
struct EnvironmentInitializer {
EnvironmentInitializer() {
static int only_once = (do_something(), 0);
}
} env_initializer;
public:
MemberClass m_class;
MyClass(int xyz) : m_class(classInit(xyz)) {
}
};
Используется оператор запятой. Обратите внимание, что вы можете поймать любое исключение, выданное do_something
, используя блок try-try
class MyClass {
static int classInit(int n) { ... }
struct EnvironmentInitializer {
EnvironmentInitializer() {
static int only_once = (do_something(), 0);
}
} env_initializer;
public:
MemberClass m_class;
MyClass(int xyz) try : m_class(classInit(xyz)) {
} catch(...) { /* handle exception */ }
};
Функция do_something
будет вызвана снова в следующий раз, если она вызвала исключение, которое вызвало невозможность создания объекта MyClass
. Надеюсь, это поможет:)