我有以下Pimpl类,其中FooPrivate
类中的成员之一是指向类A的指针,该类应在Foo:init()
中动态分配并在Foo:stop()
或in中破坏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()
和FooPrivate::stop()
之类的帮助器函数更干净吗,这些函数将从Foo:init()
和Foo:stop()
中调用,并在其中删除A *a
FooPrivate
的dtor代替?
谢谢。
答案 0 :(得分:1)
我担心的是A * a的所有权
然后使用智能指针,例如:
std::unique_ptr<A> a;