c++ - 私有类实现中的 Pimpl 和指针
问题描述
我有以下Pimpl类,其中类中的一个成员FooPrivate
是指向类 A 的指针,该类 A 应该在. 到目前为止,我有这个:Foo:init()
Foo:stop()
Foo
foo.h:
#ifndef FOO_H
#define FOO_H
#include <QtGlobal>
class FooPrivate;
class Foo
{
public:
Foo();
void init(); // here we should dynamically instanciate an object of class A
~Foo();
private:
Q_DISABLE_COPY(Foo)
Q_DECLARE_PRIVATE(Foo)
FooPrivate * const d_ptr;
};
#endif // FOO_H
foo.cpp:
#include "foo.h"
#include "foo_p.h"
#include "a.h"
Foo::Foo()
: d_ptr(new FooPrivate)
{
Q_D(Foo);
d->a = nullptr;
}
void Foo::init()
{
Q_D(Foo);
if (d->a) // init should happen only once
return;
// and d->a should be instanciated here
d->a = new A;
}
void Foo::stop()
{
Q_D(Foo);
delete d->a;
d->a = nullptr;
}
Foo::~Foo()
{
Q_D(Foo);
delete d->a;
delete d_ptr;
}
foo_p.h:
#ifndef FOOPRIVATE_H
#define FOOPRIVATE_H
class Foo;
class A;
struct FooPrivate
{
FooPrivate() {}
A *a;
};
#endif // FOOPRIVATE_H
我关心的是A *a
代码中的所有权和分配位置?在Foo
课堂上还是在FooPrivate
?
FooPrivate::init()
创建像and这样的辅助函数是否更干净FooPrivate::stop()
,它将从Foo:init()
and调用,并且在 dtor 中Foo:stop()
删除,而不是?A *a
FooPrivate
谢谢你。
解决方案
我担心的是 A *a 的所有权
然后使用智能指针,例如:
std::unique_ptr<A> a;
推荐阅读
- python - 是否有内置的 Python3 用于格式化代表多项式的前导系数的字符串?
- google-chrome-extension - 如何在扩展中嵌入来自 CSP 限制域的页面?
- c - 如何将 char 参数从 VB6 应用程序传递给 C DLL?
- javascript - JavaScript:附加到 .CSV 的顶部
- dynamics-crm - Dynamics 365 - 未过期的许可证密钥?服务器 2 服务器身份验证
- c# - 我需要能够使用 Pcap.Net 填充 tcp 数据包的以太网层
- javascript - 如何在 JavaScript 中自定义 LISP 中编写宏扩展
- java - 关闭 AutoCloseable 的正确方法
- ruby - 通过 HTTP PUT 上传数据,无需多部分装订线
- angular - angular2-multiselect:搜索不工作的延迟加载