如何初始化需要派生类中的构造函数参数的成员对象

How to initialize member objects that requires constructor parameters in derived classes?

本文关键字:构造函数 参数 成员对象 派生 初始化      更新时间:2023-10-16

我想在我的Base类中包含Composed对象,并且不同的派生类具有不同的配置。但是,Composed类在构造函数中需要参数,并且我无法控制其体系结构。

编译器报告错误,因为Composed参数应在类初始化时传递Base。但我只希望它在派生类中初始化。在这种情况下我该怎么办?

class Base{
  public:
    Base(); //Error
  protected:
    Composed comp;
};
class Composed{
  public:
    Composed(int id):id(id);
  private:
    int id;
};
class Derived_1:public Base{
  public:
    Derived():comp(1234){};
};    
class Derived_2:public Base{
  public:
    Derived():comp(2345){};
};   

您必须将该参数传递给 Base,然后将其传递给 comp:

class Composed{
  public:
    Composed(int id):id(id);
  private:
    int id;
};
class Base{
  public:
    Base(int id):comp(id){}
  protected:
    Composed comp;
};
class Derived_1:public Base{
  public:
    Derived():Base(1234){};
};    
class Derived_2:public Base{
  public:
    Derived():Base(2345){};
}; 

假设你构造了一个Base对象。它怎么知道要传递给comp构造函数的参数?Base类从根本上是有缺陷的,这就是你出现错误的原因。它需要知道如何构造它的成员对象Composed

您可以为 Composed 添加默认构造函数,然后在 Derived_1Derived_2 中修改此对象。或者,正如其他人建议的那样,您可以让Base的构造函数获取参数来构造comp。这对我来说听起来更可取,但这取决于您的用例。

请记住,当您构造Derived_1Derived_2时,Base类是创建的第一个东西,在其他成员变量之前。

有几个选项。 最直接的是将生成 Comp 所需的对象传递给基类构造函数。

class Base{
  public:
    Base(int id):comp(id){}
protected:
    Composed comp;
};
class Derived_1:public Base{
  public:
    Derived():Base(1234){}
};    
class Derived_2:public Base{
  public:
    Derived():Base(2345){}
};   

另一种可能性是不在基类中包含 Comp。 将其放在每个派生类中。您可以将纯虚函数添加到返回 Comp(或其地址)的基类中。

另一个选项是存储指向 Comp 的指针(可能是unique_ptr)并将其分配到派生类中。