A value type will never act polymorphically, its type is set in stone at compile time. Only through using a pointer or reference can a given piece of code be passed different types at runtime.
You can expose the value as a reference too, which is slightly safer:// Renderer.h Renderer &getGlobalRenderer(); // Main.cpp namespace { Renderer *globalRenderer = 0; } Renderer &getGlobalRenderer() { assert(globalRenderer); return *globalRenderer; } int main() { Renderer renderer; globalRenderer = &renderer; // Rest of program globalRenderer = 0; }This mechanism allows you to hide the dangerous raw pointer in main(), but yet still expose the global value. Note that this approach avoids dynamically allocating the renderer - but doesn't prevent you from doing so either. This also simplifies cleanup - the renderer will naturally be destroyed at the end of main(), or if you return early, or if an exception is thrown.
Damn, I'll use it in my code, it's a nice way for allocating important global variables
I should re-read my C++ book...
Thanks for the help