繁体   English   中英

纯虚方法返回const参考

[英]Pure virtual method returning const reference

我有一个抽象class AbstractClass 我所有的派生类都应具有一些const std::vector但...此字段与派生class (具有类型)相关联-与实例无关。 因此,将其设置为static可能很棒。 当然,我不能在基类中定义它,也不能强迫在将来可以添加的每个派生类中实现它。

因此,我希望有人将定义新的派生类将其实现为static (如果没有,程序应该可以正常运行,但是会占用不必要的内存...。)。

所以我有一个纯vitual方法返回这个变量:

virtual const std::vector<SomeType>& getVec() const = 0;

我现有的派生类定义为:

class DerivedClass : public AbstractClass
{
public:
    const std::vector<SomeType>& getVec() const { return vec; }
private:
    static const std::vector<SomeType> Vec;
}

我尽力做到这一点,并考虑其他程序员添加新的派生类并以不同的方式实现它的可能性。例如:

 const std::vector<SomeType>& getVec() const { return std::vector<SomeType>{ arg1, arg2}; }

我将返回的类型定义为const reference因为我想避免复制(以防Vec是类的成员)...公开此方法是否安全? 返回const reference是否有任何危险?

公开此方法可以安全吗?

是的。

返回const reference是否有任何危险?

不,没有。


如果另一个开发人员按照您所显示的方式实现了该接口,那么他们最终将在代码中出现未定义的行为,并且迟早它会失败。

没有语言功能可以阻止您使用其他界面并错误地实现它。

您可以通过提供一个不同的接口来继承来执行设计,而CRTP可以实现所需的行为。 您希望每个类都有一个std::vector静态对象吗? 您执行以下操作1

class AbstractClass 
{
    template<typename>
    friend class DerivedBase;

    AbstractClass() = default;

  public:
    virtual const std::vector<SomeType>& getVec() const = 0;
};

template<typename CRTP>
class DerivedBase : AbstractClass 
{
  protected:
    DerivedBase() = default;
    static const std::vector<SomeType> vec;

  public:
    const std::vector<SomeType>& getVec() const { return vec; }
};

class DerivedClass : DerivedBase<DerivedClass>
{
};

现在每个DerivedClass是,一个AbstractClass通过强制执行这种设计的中介。 多亏了CRTP,每个DerivedClass自动获得了自己的静态向量。


[1]为了简化代码,我省略了与正确性有关的重要细节,例如虚拟析构函数。 不要忘记他们。

如果您的成员函数的调用者遵守规则,那么public此函数绝对没有危险。

他们也有可能const_cast向量并开始对其进行修改。 如果您不信任用户,则需要切换到复制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM