簡體   English   中英

使用unique_ptr作為抽象基類中的私有成員

[英]Using a unique_ptr as a private member in an abstract base class

我對C ++很新(但不是C或OOP),但我正在嘗試以“正確”的方式做事並避免任何不良和/或危險的習慣,因此我使用Google的C ++編碼指南和Effective C ++作為我的學習起點。

我有一個抽象的基類,其中unique_ptr作為成員。 如果我將其設為私有且僅通過getter提供對派生類的訪問(根據Google C ++樣式指南),這是最好的方法嗎? 或者我錯過了潛在的陷阱?

Base.h:

#include "Document.h"

typedef std::unique_ptr<Document> pDOC;

class Base {
public:
    Base();
    virtual ~Base() = 0;

    pDOC& GetDoc();

private:
    // Unique pointers cannot be shared, so don't allow copying
    Base(Base const &); // not supported
    Base &operator=(Base const &); // not supported
    pDOC m_doc;
};

Base.cpp

#include "base.h"

Base::Base()
: m_xmldoc(new Document) {}

// Class destructor (no need to delete m_doc since it is a smart pointer)
Base::~Base() {}

pDOC& Base::GetDoc() {
    return m_doc;
}

首先,調用它upDoc而不是pDOC - unique_ptr是非常奇怪的,你需要一些跡象表明該類型不僅僅是一個指針。 (很有可能將指針類型定義為以小寫p開頭,因此許多人可能會被您的使用所困惑)。

其次,如果GetDoc僅用於派生類,則應protectedpublic

第三,我要求向所有孩子充分暴露對unique_ptr的引用。 Base的責任是什么? 它管理m_doc的生命周期嗎? 如果是這樣,則公開Document*而不是upDocreturn m_doc.get();而不是return m_doc;

如果所有Base都持有m_doc而不管理其生命周期,那為什么它存在? 它不提供公共接口,並且幾乎不提供任何功能。

如果我將其設為私有,並且僅通過getter提供對派生類的訪問

然后,您正在進行額外的輸入,以獲得與直接提供公共/受保護成員相同的效果。 不可否認,您可以向訪問者添加代碼,並且可以設置斷點,但這並不會改變您通過提供對內部的直接訪問來破壞封裝的事實。

obj.GetDoc().release() ,沒有什么可以阻止該類型的用戶執行obj.GetDoc().release()並打破您可能對您的類型使用的不變量。

另一種方法是公開對std::unique_ptr管理的對象的引用,例如:

    const Document& getDocument() const { return *m_doc; }
    Document& getMutableDocument() { return *m_doc; }

Jonas Devlieghere 在這里建議這是一種暴露“獨特指針容器”的可能方法,因為他認為“ [b] y返回引用而不是指針,你明確表示調用者不負責管理[指向的]對象]的一生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM