如何实现派生类Y基于单个double引用构造大小为1的std::vector引用以继承类X?
解决方案
首先明确两个核心限制:
- 类X的构造函数要求传入非const的
std::vector<double>左值引用,临时对象(右值)无法直接绑定,且临时对象生命周期极短,会导致引用悬空。 - C++中派生类的构造顺序是:先调用基类构造函数,再初始化派生类的成员变量,因此不能直接用派生类的vector成员初始化基类(基类初始化时成员还未构造)。
可行实现方案:动态分配vector
通过动态分配vector并使用智能指针管理内存,确保在基类初始化时vector已存在,且生命周期与Y对象同步。
完整代码示例:
#include <vector> #include <memory> class X { private: std::vector<double> & values_; public: X(std::vector<double> & values) : values_(values) {} }; class Y : public X { private: std::unique_ptr<std::vector<double>> vec_ptr_; public: Y(double & value) : X(*(vec_ptr_ = std::make_unique<std::vector<double>>(1, value))) {} };
方案说明
std::unique_ptr负责管理动态分配的vector,Y对象销毁时会自动释放内存,避免内存泄漏。- 初始化列表中先完成
vec_ptr_的赋值(指向新创建的、包含value的vector),再将该vector的引用传递给X的构造函数,此时vector已完全构造,引用有效。 - 由于
std::unique_ptr不可拷贝,Y的拷贝构造和赋值运算符会被默认禁用,避免了多个Y对象共享同一个vector的问题。
另一种可选方案(若允许修改X)
如果可以修改X的构造函数,将参数改为const std::vector<double>&,则可以直接传递临时对象,实现更简洁:
// 修改后的X类 class X { private: const std::vector<double> & values_; public: X(const std::vector<double> & values) : values_(values) {} }; // Y类实现 class Y : public X { public: Y(double & value) : X(std::vector<double>{value}) {} };
但此方案依赖于修改X的定义,若无法修改X则不适用。
内容的提问来源于stack exchange,提问作者11house
相关产品推荐
相关产品推荐

