我有一个关于风格的问题。我有一个类(在我的例子中是一个选项),它取决于外生对象的价值(利率)。我的目标是为外生对象(Rate)创建一个抽象基类,以便我可以构造变体,例如 SimulatedRate 或 ConstantRate,它们将在我的依赖类 Option 中工作。
但是,我在 C++ 中发现,由于我显然无法实例化抽象基类,因此我必须存储对基类的指针或引用。我担心的是,当实例化的外生对象超出依赖类之外的范围时,我的依赖类将指向垃圾。
在 C++ 中是否有合理的方法利用多态性来解决这个问题?
我当前的代码:
class Dependent
{
public:
Dependent(const Exogenous& exo) : exo_(exo) {}
double getSomething() const { exo_.interfaceMethod(); }
private:
Exogenous& exo_;
}
class Exogenous
{
public:
virtual double interfaceMethod() const=0;
}
class ExogenousVariationA
{
public:
virtual double interfaceMethod() const { return resultA; }
}
class ExogenousVariationB
{
public:
virtual double interfaceMethod() const { return resultB; }
}
你的担心是有道理的。由于您将客户端传入的对象存储到引用,因此您相信该客户端会在您需要时保持该对象处于活动状态。这很容易导致问题。当然,如果您使用原始指针来动态分配对象,情况也是如此。如果客户这样做delete
在你完成之前就对这个对象进行操作,你又遇到了问题。
解决方案是强制客户端在对象的生命周期内赋予您某种责任。做到这一点的方法是请求一个智能指针。根据您的问题,您可能需要std::unique_ptr
or std::shared_ptr
。如果您想从客户那里获得所有权,请使用前者;如果您想与客户共享所有权,请使用后者。假设你选择std::unique_ptr
,然后您将定义您的Dependent
类为:
class Dependent
{
public:
Dependent(std::unique_ptr<Exogenous> exo) : exo_(std::move(exo)) {}
double getSomething() const { exo_->interfaceMethod(); }
private:
std::unique_ptr<Exogenous> exo_;
}
客户端会像这样使用它:
std::unique_ptr<Exogenous> ptr(new ExogenousVariationA());
Dependent dep(std::move(ptr));
现在,当您的客户通过std::unique_ptr
对于您来说,他们授予您该对象的所有权。该对象仅在以下情况下才会被销毁your std::unique_ptr
被摧毁(这将是当你的Dependent
已被销毁,因为它是成员)。
或者,如果您采取std::shared_ptr
那么一旦客户和你的对象都将被销毁std::shared_ptr
s 被摧毁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)