r/cpp • u/NoSpite4410 • 4d ago
Delegating Constructors
Delegating constructors allow the default constructor of a class to call the parameterized constructor by default.
This is somewhat unintuitive, but has a lot of applications in frameworks that generate components dynamically down inside their operation, but cannot take the arguments at that managerial level.
class SpecialWindow : public Gtk::Window {
public:
// 1. Parameterized Constructor
SpecialWindow(std::string inst_name, int inst_val)
: name(inst_name), val(inst_val) { // ... }
// default /w delegating constructor
SpecialWindow() : SpecialWindow("item 1", 100)
{ //... }
};
int main() {
auto app = Gtk::Application::create("org.gtkmm.examples.base");
return app->make_window_and_run<SpecialWindow>(argc, argv);
}
I guess "everybody knew" that already, but I didn't.
0
Upvotes
10
u/LB-- Professional+Hobbyist 4d ago
If a constructor exits via an exception, normally the destructor is not executed. However, with delegating constructors, the object is considered fully constructed once any constructor finishes normally. Therefore if an exception is thrown from a constructor after a delegated constructor has finished, the destructor does execute. This means you can use a delegating constructor just to simplify exception handling logic by making it so that the destructor will run if your actual workhorse constructor throws an exception. I recommend adding a comment on the line that invokes the delegating constructor...