В настоящее время я обсуждаю с моим учителем дизайн класса, и мы подошли к вопросу Initialize()
функций, которые он активно продвигает. Пример:
class Foo{
public:
Foo()
{ // acquire light-weight resources only / default initialize
}
virtual void Initialize()
{ // do allocation, acquire heavy-weight resources, load data from disk
}
// optionally provide a Destroy() function
// virtual void Destroy(){ /*...*/ }
};
Все с дополнительными параметрами, конечно.
Теперь он также делает упор на расширяемость и использование в иерархиях классов (он разработчик игр, а его компания продает игровой движок) со следующими аргументами (дословно, только переведено):
Аргументы против конструкторов:
- не может быть переопределено производными классами
- не может вызывать виртуальные функции
Аргументы для Initialize()
функций:
- производный класс может полностью заменить код инициализации
- производный класс может выполнять инициализацию базового класса в любое время во время своей собственной инициализации
Меня всегда учили выполнять настоящую инициализацию непосредственно в конструкторе и не предоставляют такие Initialize()
функции. Тем не менее, у меня наверняка не так много опыта, как у него, когда дело доходит до развертывания библиотеки / движка, поэтому я решил спросить у добрых стариков.
Итак, каковы аргументы за и против таких Initialize()
функций? Зависит ли это от среды, где его следует использовать? Если да, просьба привести аргументы в пользу разработчиков библиотеки / движка или, если возможно, даже разработчика игр в целом.
Редактировать : Я должен был упомянуть, что такие классы будут использоваться как переменные-члены только в других классах, поскольку что-либо еще не имело бы для них смысла. К сожалению.