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.
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");