假设我有这个标题:
#include <vector>
class B;
class A
{
...
private:
std::vector<what_pointer B> holder;
};
我不想在标题中包含B,所以我制作了&#34; B&#34;向前引用它。但是标题有B的那个容器,并且因为B的真正标题只包含在Cpp中,所以我必须在容器内使用指向B的指针。
显然,我可以为A创建一个析构函数,它通过&#34; holder&#34;并且de分配指针指向的所有内存区域。但是我想知道是否有一个智能指针&#34;应该&#34;在这种情况下使用而不是原始指针。
答案 0 :(得分:1)
在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)) {}
// ...