如何使用 C++11 unique_ptr 实例化我的代码?
How to Instantiate my code utilizing C++11 unique_ptr?
在我的实验性游戏引擎中,我目前正在使用原始指针在堆外创建一些游戏子系统。基本上,我派生的 classes 使用它们的构造函数调用 base 中的受保护构造函数,该构造函数为它们更新这些子系统。我的代码是这样的:
Entity.h(基准 class)
#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 的 unique_ptr?我无法弄清楚如何在我的 classes 中正确初始化此智能指针。
非常简单。您只需将所有原始指针定义更改为 std::unique_ptr
,基本上就完成了。
std::unique_ptr<BlazeGraphics::Graphics> renderer;
唯一指针的初始化方式与初始化原始指针的方式相同。当持有它们的对象死亡时,它们将被自动删除,所以你 不需要 需要在析构函数中手动释放内存(如果你有任何 delete <...>
语句,请删除它们) .
您也不需要更改使用指针的代码,因为它们指向的对象是使用 ->
运算符访问的,与原始指针相同。
在我的实验性游戏引擎中,我目前正在使用原始指针在堆外创建一些游戏子系统。基本上,我派生的 classes 使用它们的构造函数调用 base 中的受保护构造函数,该构造函数为它们更新这些子系统。我的代码是这样的:
Entity.h(基准 class)
#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 的 unique_ptr?我无法弄清楚如何在我的 classes 中正确初始化此智能指针。
非常简单。您只需将所有原始指针定义更改为 std::unique_ptr
,基本上就完成了。
std::unique_ptr<BlazeGraphics::Graphics> renderer;
唯一指针的初始化方式与初始化原始指针的方式相同。当持有它们的对象死亡时,它们将被自动删除,所以你 不需要 需要在析构函数中手动释放内存(如果你有任何 delete <...>
语句,请删除它们) .
您也不需要更改使用指针的代码,因为它们指向的对象是使用 ->
运算符访问的,与原始指针相同。