2017-01-30 13 views
0

В моем экспериментальном игровом движке я в настоящее время создаю некоторые подсистемы игры на куче с необработанными указателями. В принципе, мои производные классы используют свои конструкторы для вызова защищенного конструктора в базе, какие новости для этих подсистем для них. Мой код это примерно так:Как создать код моего кода, используя C++ 11 unique_ptr?

Entity.h (Базовый класс)

#pragma once 
#include <memory> 

namespace BlazeGraphics{ class Graphics; } 
namespace BlazePhysics{ class Physics; } 
namespace BlazeInput{ class Controller; } 

namespace BlazeGameWorld 
{ 
    class Entity 
    { 
    protected: 
     Entity(BlazeGraphics::Graphics* renderer, BlazePhysics::Physics* physics, BlazeInput::Controller* controller); 

     BlazeGraphics::Graphics* renderer; 
     BlazePhysics::Physics* physics; 
     BlazeInput::Controller* controller; 
    }; 
} 

Entity.cpp

#include "Graphics/Graphics.h" 
#include "Input/Controller.h" 
#include "Physics/Physics.h" 
#include "Input/Input.h" 
#include "Entity.h" 

namespace BlazeGameWorld 
{ 
    Entity::Entity() 
    {} 

    Entity::Entity(BlazeGraphics::Graphics* renderer, BlazePhysics::Physics* physics, BlazeInput::Controller* controller) : 
     renderer(renderer), 
     physics(physics), 
     controller(controller), 
     position(0.0f, 0.0f), 
     velocity(0.0f, 0.0f) 
    { 
    } 

    Entity::~Entity() 
    { 
    } 
} 

Player.cpp (производный)

#include "Graphics/Graphics.h" 
#include "Input/Input.h" 
#include "Input/PlayerController.h" 
#include "Physics/Physics.h" 
#include "Player.h" 

namespace BlazeGameWorld 
{ 
    Player::Player() : 
     Entity(new BlazeGraphics::Graphics, new BlazePhysics::Physics, new BlazeInput::PlayerController) 
    { 
    } 

    Player::~Player() 
    { 
    } 
} 

Как я бы обновил() этот код, чтобы правильно использовать уникальную уникальную C++ 11? Мне трудно понять, как правильно инициализировать этот умный ptr в моих классах.

+0

Я бы предупредил об использовании unique_ptr для всего. Я хотел бы предложить минутку, чтобы посмотреть, какие типы объектов нужно будет получить из разных единиц перевода и классов из общего проекта, а для тех, которые соответствуют этому описанию, вместо этого я бы использовал shared_ptr. Теперь, что касается объекта, который будет существовать один раз и будет иметь время жизни приложения, тогда имеет смысл иметь уникальный_ptr этого объекта. –

ответ

2

Это очень просто. Вы просто измените все свои определения исходных указателей на std::unique_ptr, и в основном вы закончили.

std::unique_ptr<BlazeGraphics::Graphics> renderer; 

Уникальные указатели инициализируются так же, как и исходные указатели. Они будут удалены автоматически, когда объект, который их удерживает, умирает, поэтому вы делаете не необходимо освободить память вручную в деструкторе (если у вас есть какие-либо delete <...> заявления, удалите их).

Вам также не нужно менять код, который использует указатели, так как к объектам, к которым они указывают, обращаются с помощью оператора ->, так же как и с необработанными указателями.

+1

Остерегайтесь различий в семантике! 'unique_ptr' подразумевает принадлежность, необработанный указатель - нет. Если вы не можете найти соответствующее 'delete' для каждого нового' unique_ptr', это может означать, что вы не являетесь владельцем объекта. – rustyx

+1

@RustyX, если у вас нет кода, который утечки каждого объекта, потому что он не имеет удалений, как пример в вопросе. – Caleth

+0

Конструктор базового класса должен был бы 'std :: move' из своих параметров в инициализации, если вы измените его подписи, чтобы использовать' unique_ptr '(что вам нужно) – Caleth

 Смежные вопросы

  • Нет связанных вопросов^_^