C++ Как скопировать данные указателя (и все его системы) на другой указатель того же типа?

Мне легче объяснить такие вещи в терминах видеоигр. Я постараюсь быть максимально ясным, пожалуйста, потерпите меня ...

У меня есть класс Пуля, который состоит из разных компонентов, таких как компонент 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;

Технически такой способ работает. Однако я думаю, что копируются только данные обычных членов, но не компонент спрайта. Он указывает только на спрайтовый компонент первой пули. По крайней мере, я так думаю.

Надеюсь, я четко объяснил эту проблему. Спасибо, что нашли время.

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

tadman 10.04.2021 05:23

Если вы хотите использовать одни и те же данные Sprite для всех экземпляров Bulltet, вам вообще не следует копировать данные. Чтобы решить возникающие проблемы управления памятью в таких случаях, C++ предоставляет класс std::shared_ptr<T>, где T в вашем случае будет Sprite.

πάντα ῥεῖ 10.04.2021 05:26

Копирующие конструкторы (как уже упоминалось) могут быть хорошим началом, так как тогда вы можете использовать Bulle* bullet2 = new Bullet(*bullet1);. Для назначения вам понадобится перегрузка оператора copy-назначение.

Some programmer dude 10.04.2021 05:26

И, пожалуйста, подумайте о владение спрайта. Будет ли когда-нибудь доступен только один спрайт? Затем используйте std::shared_ptr и следуйте правило нуля. В противном случае, если каждому Bullet действительно нужен свой собственный уникальный объект-спрайт, используйте std::unique_ptr и следуйте правило пяти (хотя вам не понадобится деструктор, так что, возможно, правило четырех?)

Some programmer dude 10.04.2021 05:28

Спасибо всем. Я буду помнить все, что ты сказал, я ценю это

Bathory 10.04.2021 06:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
29
0

Другие вопросы по теме