具有2个相同数据类型成员的构造函数重载

时间:2020-05-24 15:53:20

标签: c++ constructor-overloading

让我说我有一个带有两个std :: string成员和一个int值的类,如:

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{};
};

我能以某种方式重载2个构造函数,其中一个将初始化groupNr和group1,而另一个ctor初始化groupNr和group2吗?这样,未在ctor调用中初始化的字符串之一就是空字符串。

3 个答案:

答案 0 :(得分:2)

有几种方法可以实现预期的行为:

  • 命名构造函数

    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");
    
  • 标记为构造函数

    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");
    
  • 命名参数(有关可能的实现,请参见there

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

答案 1 :(得分:0)

对于重载函数/构造函数,它们必须具有2个不同的签名。由于两种情况下要提供的预期类型都是相同的,因此您必须提供第三个参数,其中之一可能带有默认值。但同样要注意未初始化的局部字段,因为它们会由编译器生成的代码自动初始化。

答案 2 :(得分:0)

这里的解决方案之一是简单地使基类具有“普通”成员

groupNr(groupNr)

和其他两个单独的成员在每个派生类中都有,那么您可以在初始化派生类时通过调用基类的构造函数来初始化基本成员groupNr:

class DataGroup {
 public:
  explicit DataGroup (const std::vector<int>& groupNrs)
      : groupNrs(groupNr){};

  std::vector<int> groupNrs{};
};

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

  std::string group1{};
};

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

  std::string group2{};
};