用于保存对 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)) {}
// ...
假设我有这个 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)) {} // ...