itemlayoutmanager.C
gives an example of a design pattern that uses LibCXX's
x::singletonptr
s
in ways that are compatible with LibCXX Widget Toolkit's rules for
reference-counted objects and their
references.
class appObj : virtual public x::obj { public: // ... }; typedef x::singletonptr<appObj> app; // .............. auto main_window=x::w::main_window::create( [] (const auto &main_window) { // ... }); app my_app{x::ref<appObj>::create(main_window)};
The appObj
class contains references to
key widgets and other application data, such as:
The main application window itself.
The main window's widgets.
Other application data.
itemlayoutmanager.C
stores the list of discrete pizza toppings in its application object.
The appObj
object and the constructed
x::singletonptr
get
constructed in automatic scope. Because they get constructed in
automatic scope, both of the object and the
x::singletonptr
get destroyed before the
main
itemlayoutmanager
() function returns.
itemlayoutmanager
() waits for the application
window's “Close” button, that closes and terminates
the application.
All the references to this object go out of scope and get destroyed in the right order. Then, elsewhere in the application code:
app my_app; if (!my_app) return; my_app->method();
This default-constructed x::singletonptr
gets declared anywhere in the application code, also in automatic
scope, anywhere where it's convenient to do so.
The constructed x::singletonptr
references
the same object that's already constructed.
This basic approach involes constructing the singleton object
(appObj
in this case) in
main
() or some other high level function that
does not terminate until the entire application gets terminated.
The singleton object's x::singletonptr
does not exists in global or static scope, but
in automatic scope of this function that returns only when the
entire application terminates.
Elsewhere in the application, as needed, the same
x::singletonptr
gets constructed, also in
automatic scope, and this instance ends up referencing the same object
that already exists in the high level function's automatic scope
(provided that the high level function hasn't terminated and destroying
its automatically-scoped objects).
In this manner, all references to the singleton object exist in automatic scope, and get automatically cleaned up when execution leaves the scope; but the application data behaves as a global singleton, conveniently accessible anywhere in the application.
See Chapter 30, Print Dialog for another example of using singleton pointer objects.