Przekazanie wskaźnika do obiektu – kod generuje wyjątek

0

Witam mam taki kod

class Level;

class PlayState : public GameState, public std::enable_shared_from_this<PlayState>
{
private:
	sf::View viewe;
	std::shared_ptr<sf::Event> event;
	std::unique_ptr<Level> currentLevel;
	std::vector<std::unique_ptr<Level>> level;
	std::unique_ptr<Player> player;
public:
	~PlayState();
	void draw();
	void update(const float dt);
	void input();
	PlayState(std::shared_ptr<Game> game);
	std::shared_ptr<PlayState> getShPrt();

};
PlayState::PlayState(std::shared_ptr<Game> game)
{
	event = std::make_shared<sf::Event>();
	this->game = game;
	player=std::unique_ptr<Player>(new Player(100,100, Layers::CREATURES, event));
	currentLevel = std::unique_ptr<Level>(new TestLevel_01(getShPrt(),"abc", event, game->window, std::move(player)));
	//std::cout << "Create PlayState - " << getShPrt() << std::endl;;
}

std::shared_ptr<PlayState> PlayState::getShPrt()
{
	return shared_from_this();
}

Potrzebuję do Obiektu Level -> TestLevel_01 podać shared_ptr który powstaje z za pomocą enable_shared_from_this i shared_from_this() niestety dostaję:

Unhandled exception at 0x00007FFDEEC4F218 in TestGame.exe: Microsoft C++ exception: std::bad_weak_ptr at memory location 0x00000044484FE6D8.

robię to tak jak jest w dokumentacji ale niestety nie działa
Chcę to zrobić aby nie używać raw pointerów.

0
void MenuState::loadgame()
{
	game->pushState(std::shared_ptr<GameState>(new PlayState(game)));
}

tak powstaje PlayState

0

do tego wkładam PlayState

	std::vector<std::shared_ptr<GameState>> states;

w taki sposób dodaję

void Game::pushState(std::shared_ptr<GameState> state)
{
	states.push_back(state);
}

1
void MenuState::loadgame()
{
    game->pushState(std::shared_ptr<GameState>(new PlayState(game)));
}

W tym pierw wykonuje się new PlayState(game). Jeśli się zastanowisz, to zauważysz, ze w tym momencie ten obiekt nie ma shared pointera, a w jego konstruktorze wywołujesz shared_from_this(). Nie rób tego w konstruktorze.

0

jakieś porady jak to obejść?? niestety nie wiem jak, brakło mi pomysłów ;/

0

Zrób funkcję odpowiedzialną za tworzenie obiektu, albo zastanów się nad designem - dlaczego klasa ma trzymać shared pointera do samej siebie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1