我有以下Pimpl类,其中FooPrivate
类中的成员之一是指向类A的指针,该类A应该在Foo:init()
中动态分配并在Foo:stop()
或Foo
的dtor中销毁。到目前为止,我有这个:
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()
和FooPrivate::stop()
调用的诸如Foo:init()
和Foo:stop()
的辅助函数是否更干净,而不是在A *a
的目录中删除FooPrivate
?谢谢。
最佳答案
我担心的是A * a的所有权
然后使用智能指针,如下所示:
std::unique_ptr<A> a;