Мне легче объяснить такие вещи в терминах видеоигр. Я постараюсь быть максимально ясным, пожалуйста, потерпите меня ...
У меня есть класс Пуля, который состоит из разных компонентов, таких как компонент Sprite и компонент Transform ... Это будет выглядеть примерно так:
class Bullet
{
public:
Bullet( texture2D texture, Rectangle sourceRectangle, Rectangle destinationRectangle )
Bullet();
~Bullet();
// Returns a pointer to its sprite component so that I can use it wherever I want in the scene:
Sprite* const Sprite() const{ return this->sprite; }
// Setters:
void SetAngle( float new_angle ){ this->angle = new_angle; }
void SetSpeed( float new_speed ){ this->speed = new_speed; }
void SetRadius( float new_radius ){ this->radius = new_radius; }
private:
// Sprite component:
Sprite* sprite;
private:
// Regular member data:
float angle;
float speed;
float radius;
};
Компонент спрайта - это просто еще один класс, который содержит текстура, исходный прямоугольник, прямоугольник назначения и некоторые функции-члены для управления им (Move, Rotate, SetTexture и т. д.). Ничего особенного. Он инициализируется в конструкторе
Что мне нужно сделать, так это иметь возможность полностью скопировать один указатель на объект пули в другой новый указатель на пулю, включая компонент спрайта. Что-то вроде этого:
// These arguments will be "fed" into the sprite component
Bullet* bullet1 = new Bullet( texture, sourceRect, destRect );
Bullet* bullet2 = new Bullet(); // Using default constructor.
*bullet2 = *bullet1;
Технически такой способ работает. Однако я думаю, что копируются только данные обычных членов, но не компонент спрайта. Он указывает только на спрайтовый компонент первой пули. По крайней мере, я так думаю.
Надеюсь, я четко объяснил эту проблему. Спасибо, что нашли время.
Если вы хотите использовать одни и те же данные Sprite для всех экземпляров Bulltet, вам вообще не следует копировать данные. Чтобы решить возникающие проблемы управления памятью в таких случаях, C++ предоставляет класс std::shared_ptr<T>, где T в вашем случае будет Sprite.
Копирующие конструкторы (как уже упоминалось) могут быть хорошим началом, так как тогда вы можете использовать Bulle* bullet2 = new Bullet(*bullet1);. Для назначения вам понадобится перегрузка оператора copy-назначение.
И, пожалуйста, подумайте о владение спрайта. Будет ли когда-нибудь доступен только один спрайт? Затем используйте std::shared_ptr и следуйте правило нуля. В противном случае, если каждому Bullet действительно нужен свой собственный уникальный объект-спрайт, используйте std::unique_ptr и следуйте правило пяти (хотя вам не понадобится деструктор, так что, возможно, правило четырех?)
Спасибо всем. Я буду помнить все, что ты сказал, я ценю это





Сделайте конструктор копирования. Не надо просто так хлопать. Также стоит отметить: старайтесь избегать
new. Управление памятью - огромная проблема. Указатели - это проблема, которую вы должны избегать или, по крайней мере, оборачивать такими вещами, какstd::unique_ptr.