簡體   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