Как было сказано несколькими ответившими людьми, вы не можете отложить вызов конструктора базового класса, но Конрад дал хороший ответ, который вполне может решить вашу проблему. Однако у этого есть свои недостатки (например, когда вам нужно инициализировать несколько функций со значениями, вычисления которых имеют общие промежуточные результаты), поэтому, чтобы быть полным, вот еще один способ решить проблему фиксированного порядка инициализации, используя это.
Учитывая фиксированный порядок инициализации, если у вас есть контроль над производным классом (а как иначе вы могли бы возиться с одним из его кторов?), вы можете проникнуть в частную базу, чтобы она была инициализирована раньше других. base, который затем можно инициализировать с уже рассчитанными значениями частной базы:
class my_dirty_little_secret {
// friend class the_class;
public:
my_dirty_little_secret(const std::string& str)
{
// however that calculates x, y, and z from str I wouldn't know
}
int x;
std::string y;
float z;
};
class the_class : private my_dirty_little_secret // must be first, see ctor
, public the_other_base_class {
public:
the_class(const std::string str)
: my_dirty_little_secret(str)
, the_other_base_class(x, y, z)
{
}
// ...
};
Класс my_dirty_little_secret
является частной базой, поэтому пользователи the_class
не могут его использовать, все его материалы также являются частными, с явной дружбой, предоставляющей доступ к нему только the_class
. Однако, поскольку он указан первым в списке базовых классов, он будет надежно сконструирован до the_other_base_class
, поэтому все, что он вычислит, может быть использовано для его инициализации.
Хороший комментарий в списке базовых классов, надеюсь, не даст другим нарушить работу путем рефакторинга. .
person
sbi
schedule
29.09.2010