我在下面附加了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类型的原因。
答案 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> {};
或其他,等等。