如何初始化需要派生类中的构造函数参数的成员对象
How to initialize member objects that requires constructor parameters in derived classes?
我想在我的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_1
和 Derived_2
中修改此对象。或者,正如其他人建议的那样,您可以让Base
的构造函数获取参数来构造comp
。这对我来说听起来更可取,但这取决于您的用例。
请记住,当您构造Derived_1
或Derived_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)并将其分配到派生类中。
相关文章:
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在按值调用 (c++) 中转发构造函数参数
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 如何在构造函数参数中初始化"std::set"?
- 何时应在构造函数参数中使用 const C++?
- 使用模板化结构作为构造函数参数
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 如何使输入文本文件成为构造函数参数?c++
- shared_ptr构造函数参数是否应按值传递
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- 复制构造函数参数为0
- 用作成员构造函数参数的函数的求值顺序
- 结构中的默认成员值或默认构造函数参数
- C++将引用成员绑定到构造函数参数
- 如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?
- 模板函数指针参数与构造函数参数
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 如何基于构造函数参数模板化类成员函数的代码
- 将派生类构造函数参数传递给受保护的成员
- 如何根据构造函数参数使用超类类型初始化成员变量?