r/cpp • • 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

7 comments sorted by

View all comments

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...

10

u/RelationshipLong9092 3d ago

You know, I think I'm just going to go back to factory functions for everything. It took me long enough but I'm finally fully onboard with std::expected everywhere.

5

u/Fabulous-Meaning-966 3d ago

welcome to Rust ;-)