gpt4 book ai didi

c++ - 什么时候使用新关键字?

转载 作者:行者123 更新时间:2023-11-27 22:34:38 25 4
gpt4 key购买 nike

我正在用 SFML 开发一个小游戏,我创建了一个游戏类来存储各种类;例如,玩家类。

我用“new”关键字在堆上初始化了这个类,但经过数小时的尝试弄清楚为什么我的播放器类在某个范围后变为 null。我决定不在堆上初始化游戏,在我这样做之后,一切都很好。

谁能解释一下为什么会这样。顺便说一下,我不再在堆上创建游戏,而是展示我之前获取空引用时的代码。

int main()
{
sf::RenderWindow renderWindow(sf::VideoMode(640, 480), "Dungeon Run");

//Asset test;
//test.CreateAsset("GameAssets/Player.png");

sf::Event event;
renderWindow.setKeyRepeatEnabled(true);

Game* game = new Game(renderWindow);
// Player initialized here.
game->Initialize();
while (renderWindow.isOpen())
{
// Game->Player goes null in here.
while (renderWindow.pollEvent(event))
{

if (event.type == sf::Event::EventType::Closed)
{
renderWindow.close();
}
//set window to random color to check if working
if (event.type == sf::Event::EventType::KeyPressed) {
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) {
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) {
renderWindow.close();
}
}
else if (event.type == sf::Event::EventType::MouseButtonPressed) {
if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
}
else if (sf::Mouse::isButtonPressed(sf::Mouse::Right)) {
}
}

renderWindow.clear();
game->Draw(); // Here player was null when I tried to draw the sprite for the player.
renderWindow.display();
}
}

delete game;
game = nullptr;
}

玩家类:

class Player
{
public:
Player();
Player(std::string name)
: name(name)
{
}


std::string name = "";
double health = 100;
double stamina = 100;
int level = 1;
Asset sprite;

void attack();

~Player();
};


Assets 类别:

Asset::Asset() {

}

void Asset::CreateAsset(std::string path) {
if (!texture.loadFromFile(path)) {
std::cout << "Failed to load texture from file: " << path << std::endl;
}

sprite.setTexture(texture);
}

sf::Sprite& Asset::GetSprite() {
return sprite;
}

Asset::~Asset() {

}

Game.h 和 Game.cpp:

class Game {
private:
Player player;
sf::RenderWindow* window;
public:
Game(sf::RenderWindow& window);

void Initialize();
void Upadte();
void Draw();

~Game();
};


Game::Game(sf::RenderWindow& window) {
this->window = &window;
player = Player("Player");
}

void Game::Initialize() {
player.sprite.CreateAsset("GameAssets/player.png");
}

void Game::Upadte() {
}

void Game::Draw() {
window->draw(player.sprite.GetSprite()); // Drawing his sprite
}

Game::~Game() {
}

最佳答案

在现代 C++ 中,你几乎不需要 new 关键字

如果要在堆上创建对象,请使用 unique_ptrshared_ptr

你创建你的类

std::unique_ptr<Game> game = std::make_unique<Game>(renderWindow);

这样您就不需要delete,因为unique_ptr 会在超出范围时为您处理。

所以只需用上面的代码替换你的 new 行并用 delete 删除该行

您可能需要以下包含才能使用 std::unique_ptr

#include <memory>

至于“为什么”你有问题:负责的代码尚未发布,但我假设你有另一个地方删除游戏或设置为 nullptr

关于c++ - 什么时候使用新关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56410665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com