Во-первых, вы должны понимать, что тело конструктора предназначено только для запуска кода на complete инициализации вашего объекта в целом; элементы должны быть полностью инициализированы до ввода тела.
Ergo, все члены инициализируются в (неявном, если не явном) списке инициализации. Ясно, что const
переменные должны быть инициализированы в списке, потому что после ввода тела они уже должны быть инициализированы; вы просто пытаетесь назначить их.
Как правило, у вас нет const
участников. Если вы хотите, чтобы эти члены были неизменными, просто не предоставляйте им публичный доступ, который мог бы их изменить. (Кроме того, наличие const
членов делает ваш класс не присваиваемым; как правило, излишне.) Этот маршрут легко решает вашу проблему, так как вы просто присваиваете им значения в теле конструктора, как вам хочется.
Способ сделать то, что вы хотите, сохраняя const
, может быть:
class ImageBase
{
public:
const int width, height;
protected:
ImageBase(const MetaData& md) :
width(md.width()),
height(md.height())
{}
// not meant to be public to users of Image
~ImageBase(void) {}
};
class Image : public ImageBase
{
public:
Image(const char* filename) : // v temporary!
ImageBase(MetaData(readDataFromFile(filename)))
{}
};
Не думаю, что этот маршрут того стоит.