![](/img/trans.png)
[英]Is this a proper application of the rule of five with abstract base class and unique_ptr member?
[英]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
僅用於派生類,則應protected
不public
。
第三,我要求向所有孩子充分暴露對unique_ptr
的引用。 Base
的責任是什么? 它管理m_doc
的生命周期嗎? 如果是這樣,則公開Document*
而不是upDoc
( return 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.