2016-08-28 17 views
0

元々、抽象タイプGameState*をとったスタックを作った。だから...コピーを作成せずにunqiue_ptrでスタックするにはどうすればよいですか?

std::stack<GameState*> gameStates

はしかし、誰かが私はC++ 11のスマートポインタunique_ptrを使用する必要があります所有権を保持したい場合と私に知らされます。私はスタックに私のGameStateを押すたびだから...

std::stack<std::unique_ptr<GameState>> gameStates

だろうさて、私のコンパイラは文句を言います。私は右にはどうすればよい.gameStates.push(std::move(&splashScreen1))

no instance of overloaded function matches the argument list

SplashScreen splashScreen1(game); //gameState object declaration 
gameStates.push(std::move(&splashScreen1)); //move to stack without copying 

エラーが表示される赤い線がある

それは言う... ...どうやら何か間違ったことをやっています私はこれを解決する?

+2

テキストではなく、テキストの画像を投稿してください。 –

答えて

5

std::unique_ptrは、あなたがそれをスタックメモリを与えるためにしようとしている、ヒープメモリを所有するように設計されています。あなたがしたいのですがどのような

は次のとおりです。

std::unique_ptr<GameState> splashScreen1Ptr(new GameState(game)); 
gameStates.push(std::move(splashScreen1Ptr)); 
+0

私の 'GameState'型は抽象型なので、忘れてしまいました。抽象型でこれを行うにはどうしたらいいですか? 抽象型はインスタンス化できないので、私の状況では 'unique_ptr'は役に立たないのですか? – PrimRock

+1

@PrimRock派生ポインタを渡すことができます: 'std :: unique_ptr smartPtr(new Derived);'仮想デストラクタがあることを確認してください! –

+0

よろしくお願いします!最後の質問? 'std :: unique_ptr splashScreen1(new SplashScreen(game));' SplashScreen型をnewで割り当てますが、 'GameStates.push(std :: move(splashScreen1);)というステートメントを実行するとすぐにsplashScreen1の値が空になると、実行時に関数を呼び出すときに 'nullptr'というエラーが出ます。これは、SplashScreenオブジェクトのポインタを' splashScreen1.reset(新しいSplashScreen( 'new'を2回使用する必要がありますか? – PrimRock

関連する問題