Я хочу создать неизменяемую структуру данных, которая, скажем, может быть инициализирована из файла.Инициализация полей константы C++ после конструктора
class Image {
public:
const int width,height;
Image(const char *filename) {
MetaData md((readDataFromFile(filename)));
width = md.width(); // Error! width is const
height = md.height(); // Error! height is const
}
};
Что я могу сделать, чтобы решить эту проблему является
class Image {
MetaData md;
public:
const int width,height;
Image(const char *filename):
md(readDataFromFile(filename)),
width(md.width()),height(md.height()) {}
};
Однако
- Это заставляет меня спасти MetaData как поле в моем объекте. Который я не всегда хочу.
- Иногда логика в конструктор является гораздо более сложным, чем одну операцию чтения (например, обработка ошибок может занять несколько строк)
Таким образом, единственное решение, которое я думал вдоль линий
class A {
int stub;
int init(){/* constructor logic goes here */}
A():stub(init)/*now initialize all the const fields you wish
after the constructor ran */{}
};
Есть ли идея? (В Java
вы можете инициализировать final
s в конструкторе).
Зачем вам нужны элементы изображения, которые будут 'const'? Непрерывная структура данных будет лучше выражаться экземпляром 'const' класса структуры данных, а не экземпляром класса структуры данных, все члены которого являются' const'. Если вы будете следовать этому подходу, у вас нет никаких проблем в вашем конструкторе; 'const' -ness вашего объекта начинается только после завершения конструктора. –
В значительной степени это - не делайте переменные-члены const, действительно. – Puppy
@Charles, я хочу, чтобы все изображения были как const, насколько это возможно. Я не хочу, чтобы размер объекта менялся любым программистом после меня в методе внутри 'Image'. Я не хочу отслеживать, кто изменил этот размер изображения, если размер изображения отличается в двух местах, я могу заключить, что это 100% утечка памяти, а не ленивый программист, создающий ярлыки. Существует много веских оснований для предпочтения силы и * связи * определенное поле не должно изменяться. –