По возможности, вам следует избегать явного динамического выделения.Динамическое распределение относительно дорого и усложняет управление временем жизни объекта.
Обратите внимание, что ваш вопрос несколько вводит в заблуждение: в первом случае BaseText
и BackgroundText
не обязательно размещаются в стеке.Если объект OutlinedText
, членом которого они являются, размещен в куче или является статической переменной, то их вообще не будет в стеке.
Я думаю, что я двойникИнициализация, как у меня сейчас.
Вы: каждая переменная-член инициализируется до ввода тела конструктора, затем в теле конструктора вы назначаете переменные-члены, поэтому они эффективно «инициализируются дважды»
Вы можете (и в большинстве случаев должны) использовать список инициализации конструктора для инициализации переменных-членов:
OutlinedText::OutlinedText(std::string& text,
sf::Color MainColor,
sf::Color OffsetColor,
sf::Font& font,
sf::Vector2f Pos,
unsigned int BaseFontSize,
unsigned int BackFontSize,
float Offset)
: BaseText(text, font, BaseFontSize), // This is the constructor's
BackgroundText(text, font, BackFontSize) // initializer list
{
BaseText.SetColor(MainColor);
BackgroundText.SetColor(OffsetColor);
}
Таким образом, переменные-члены инициализируются только один раз (через инициализаторы в списке инициализаторов), а не дважды.
Должны ли я иметь их в качестве указателей и назначать их новыми, как показано ниже, и освобождатьих с помощью delete в деструкторе?
Нет: вам не нужно писать delete
в вашей программе на C ++: вы должны использовать умный указатель (например, auto_ptr
, shared_ptr
илиunique_ptr
, в зависимости от того, какой срок жизни объекта вам нужен), чтобы гарантировать, что динамически размещаемые объекты автоматически уничтожаются.Если вам нужно сохранить коллекцию объектов, вам следует использовать один из контейнеров стандартной библиотеки, например vector
, map
или set
, который также автоматически очищает объекты, которые в них хранятся.
Ручное управление временем жизни динамически распределяемого объекта утомительно, и его трудно понять правильно, и его следует избегать.Вам не нужно просто «очищаться в деструкторе», вам также нужно правильно реализовать (или подавить автоматическую генерацию) конструктор копирования и оператор присваивания копии.
C ++ принципиально отличается от C #,особенно в отношении времени жизни объектов и того, как объекты появляются, как они копируются и когда они уничтожаются.Обязательно убедитесь, что у вас есть хорошая вводная книга по С ++ , если вы действительно хотите изучать язык.