このゲームには Game クラスがあります。これはシングルトンです...ヘッダー ファイルは次のとおりです。
#ifndef SOKOBAN_GAME_H
#define SOKOBAN_GAME_H
#include <memory>
#include <SDL/SDL.h>
namespace sokoban
{
class Game
{
public:
static Game* getInstance();
void startGame();
private:
Game();
~Game();
Game(const Game&) = delete;
Game(Game&&) = delete;
Game& operator=(const Game&) = delete;
Game& operator=(Game&&) = delete;
static std::shared_ptr<Game> instance_;
SDL_Surface* mainSurface_;
};
};
#endif
これで、getInstance 関数を除いて、ほとんどの実装ファイルは重要ではなくなりました。
Game* Game::getInstance()
{
if(!Game::instance_)
{
Game::instance_ = std::shared_ptr<Game>(new Game,
[](Game* ptr)
{
delete ptr;
});
}
return Game::instance_.get();
}
ご覧のとおり、私の遅延初期化スタイルではスマート ポインターを使用する必要がありますが、パブリック デストラクタを回避しようとしているため、ラムダをデリータとして使用する必要があります。このコードは正常にコンパイルされますが、コンパイルできません。標準では個別の一意のオブジェクトであると言われているラムダが、特に SO に関するいくつかの質問を見た後、このプライベート メソッドを呼び出すことができる理由のパターンを見つけたようです。
基本的に知りたいのは、例のようなメンバー関数のラムダのアクセス規則です...