Skip to content

Instantly share code, notes, and snippets.

@chunkyguy
Created July 2, 2013 13:55
Show Gist options
  • Save chunkyguy/5909507 to your computer and use it in GitHub Desktop.
Save chunkyguy/5909507 to your computer and use it in GitHub Desktop.
// Thank you std::unique_ptr!
// Compile with
// clang++ unique_ptr.cpp -o unique_ptr -std=c++11 -stdlib=libc++ && ./unique_ptr
/* OUTPUT:
--- START ---
Game
--- MAIN ---
Screen
MainScreen
--- GAME ---
Screen
PlayScreen
~MainScreen
~Screen
--- QUIT ---
~Game
~PlayScreen
~Screen
*/
#include <iostream>
#include <memory>
struct IScreen{
IScreen(){
std::cout << "Screen" << std::endl;
}
virtual ~IScreen(){
std::cout << "~Screen" << std::endl;
}
};
struct MainScreen : public IScreen{
MainScreen(){
std::cout << "MainScreen" << std::endl;
}
virtual ~MainScreen(){
std::cout << "~MainScreen" << std::endl;
}
};
struct PlayScreen : public IScreen{
PlayScreen(){
std::cout << "PlayScreen" << std::endl;
}
virtual ~PlayScreen(){
std::cout << "~PlayScreen" << std::endl;
}
};
struct Game{
Game() : screen() {
std::cout << "Game" << std::endl;
}
~Game(){
std::cout << "~Game" << std::endl;
}
void LoadScreen(IScreen *s){
screen = std::unique_ptr<IScreen>(s);
}
void LoadMain(){
MainScreen *ms = new MainScreen;
LoadScreen(ms);
}
void LoadPlay(){
PlayScreen *ps = new PlayScreen;
LoadScreen(ps);
}
std::unique_ptr<IScreen> screen;
};
int main(){
std::cout << "--- START ---" << std::endl;
Game g;
// Main screen
std::cout << "--- MAIN ---" << std::endl;
g.LoadMain();
// Play screen
std::cout << "--- GAME ---" << std::endl;
g.LoadPlay();
std::cout << "--- QUIT ---" << std::endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment