如何使用派生类类型数据初始化std :: shared_ptr?

时间:2019-11-24 16:39:24

标签: c++ polymorphism

我在下面附加了2个简单的类:

class IParams
{

    ...

};

class QEParams : public IParams
{

    ...

};

我还有一个指向IParams类型的指针:

std::shared_ptr<IParams> parameters;

我正在尝试使用一些QEParams数据对其进行初始化,但无法正常工作。

void QEExec::initialize(IParams& params)
{

    this->parameters = std::make_shared<IParams>(params);

}

...

QEParams params(-3.0, -3.0, 2.0);
QEExec exec;
exec.initialize(params);

...

我在做错什么以及如何正确做? QEExec也是一个派生类,intialize()覆盖了基本方法,这就是参数列表中IParams类型的原因。

1 个答案:

答案 0 :(得分:0)

void QEExec::initialize(IParams& params)

因此,即使您要传递QEParams的实例,initialize也会将其视为IParams。在堆栈上创建新的共享实例时,将调用IParams'复制构造函数。

您应该将params类型更改为实际的子类

void QEExec::initialize(QEParams& params)

或使其模板化

template<class Subtype> void QEExec::initialize(Subtype& params) {
    parameters = std::make_shared<Subtype>(params);

或将分配移出功能

void QEExec::initialize(std::shared_ptr<IParams> params) {
    parameters = std::move(params);

或在界面中添加老式的Clone方法

struct IParams {
    std::shared_ptr<IParams> Clone() const = 0;
};

template<class Sub> struct ClonableParams: IParams {
    std::shared_ptr<IParams> Clone() const override {
        return std::make_shared<Sub>(static_cast<Sub>(*this));
    }
};

struct QEParams: ClonableParams<QEParams> {};

或其他,等等。