Search code examples
c++constructor-overloading

Overloading constructor with 2 same datatype members


lets say i have a class with two std::string member and one int value, like:

class DataGroup final {
 public:
  explicit DataGroup (const std::vector<int>& groupNr,
                                   const std::string& group1,
                                   const std::string& group2)
      : groupNr(groupNr)
      , group1(group1)
      , group2(group2){};

  std::vector<int> groupNrs{};
  std::string group1{};
  std::string group2{};
};

Can i somehow have 2 overloaded constructors where one will initialize groupNr and group1, and other ctor initializes groupNr and group2 ? One of the strings not initialized in ctor call would be empty string then.


Solution

  • There are several way to have expected behavior:

    • Named constructor

      class DataGroup final {
      public:
          // ...
          static DataGroup Group1(const std::vector<int>& groupNr,
                            const std::string& group)
            { return DataGroup{groupNr, group, ""}; }
          static DataGroup Group2(const std::vector<int>& groupNr,
                            const std::string& group)
            { return DataGroup{groupNr, "", group}; }
      
          // ...
      };
      
      DataGroup d = DataGroup::Group2({1, 2}, "MyGroup");
      
    • Tagged constructor

      struct group1{};
      struct group2{};
      class DataGroup final {
      public:
          // ...
          DataGroup(group1, const std::vector<int>& groupNr,
                            const std::string& group) : DataGroup{groupNr, group, ""} {}
          DataGroup(group2, const std::vector<int>& groupNr,
                            const std::string& group) : DataGroup{groupNr, "", group} {}
      
          // ...
      };
      
      DataGroup d{group2{}, {1, 2}, "MyGroup");
      
    • named parameters (see there for possible implementation)

      // ...
      DataGroup d{groupNr = {1, 2}, group2 = "MyGroup");