用于保存对 objects 的前向引用的智能指针

Smart pointer for holding forward references to objects

假设我有这个 header:

#include <vector>

class B;

class A
{
...
private:
    std::vector<what_pointer B> holder;
};

我不想在 header 中包含 B,所以我对它进行了 "class B" 前向引用。然而 header 有 B 的那个容器,并且由于 B 的真实 header 只包含在 Cpp 中,我必须在容器内使用指向 B 的指针。

显然我可以为 A 创建一个析构函数,它通过 "holder" 并取消分配指针指向的所有内存区域。但是我想知道在这种情况下是否可以使用智能指针 "should" 而不是原始指针。

  • 在c++17中,你可以简单地做

    class B;
    
    class A
    {
    public:
    ...
        ~A(); // define in cpp, as B definition should be known for destruction
    private:
        std::vector<B> holder;
    };
    

    因为 vector.

  • 允许使用不完整的类型
  • 目前,你可以

    class A
    {
    public:
        //...
        A(const A&); // should be reimplemented to copy holder
        A& operator =(const A&); // should be reimplemented to copy pimpl
        A(A&&) = default;
        A& operator =(A&&) = default;
    
        ~A();
    private:
        std::vector<std::unique_ptr<B>> holder;
    };
    

    然后

    #include "B.h"
    
    // define in cpp, as B definition should be known
    ~A::A() = default;
    
    A::A(const A& rhs) {
        for (const auto& b : rhs.holder) {
             holder.push_back(std::make_unique<B>(*b));
        }
    }
    
    // ...
    
  • 或者完全使用pimpl成语

    class A
    {
    public:
        //...
        A(const A&); // should be reimplemented to copy pimpl
        A& operator =(const A&); // should be reimplemented to copy pimpl
        A(A&&) = default;
        A& operator =(A&&) = default;
    
        ~A();
    private:
        struct Pimpl;
        std::unique_ptr<Pimpl> pimpl;
    };
    

    然后

    #include "B.h"
    
    struct A::Pimpl {
        // ...
        std::vector<B> holder;
    };
    
    // define in cpp, as B definition should be known
    ~A::A() = default;
    
    A::A(const A& rhs) : pimpl(std::make_unique<Pimpl>(rhs.pimpl)) {}
    
    // ...