c++ - 在抽象基类中使用 unique_ptr 作为私有(private)成员

标签 c++

我是 C++ 的新手(但不是 C 或 OOP),但我正在尝试以“正确”的方式做事并避免任何不良和/或危险的习惯,所以我使用 Google 的 C++ 编码指南和有效的 C++ 作为我学习的起点。

我有一个抽象基类,其成员是 unique_ptr。如果我将其设为私有(private)并且仅通过 getter 提供对派生类的访问(根据 Google C++ 样式指南),这是最好的方法吗?或者我在这里错过了一个潜在的陷阱?

基础.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;
};

基础.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

第三,我质疑向所有 child 完全公开对 unique_ptr 的引用。 Base 的职责是什么?它是否管理 m_doc 的生命周期?如果是这样,请公开一个 Document* 而不是 upDoc(return m_doc.get(); 而不是 return m_doc;)

如果所有 Base 所做的只是持有一个 m_doc 而不管理它的生命周期,那么它为什么存在?它不提供公共(public)接口(interface),并且几乎不提供任何功能。

关于c++ - 在抽象基类中使用 unique_ptr 作为私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14363172/

相关文章:

c++ - 如何使用 move 的对象?

c++ - 如何在 QComboBox 中将图标移动到文本上方

c++ - 类范围的枚举

c++ - VS2015 现在错误 C4477 "fprintf"

c++ - 为什么循环变量必须并行签名?

C++将分配器和初始化器与boost循环缓冲区一起使用

c++ - 将项目从qt4迁移到qt5时没有匹配的调用函数

C++ sublime text插件代码导航

c++ - 通过 void* 向下转型/向上转型

c++ - 从 QGraphicsView 上的数据文件中绘制点