У меня есть следующий класс Pimpl, где один из членов в классе FooPrivate
является указателем на класс A, который должен динамически размещаться в Foo:init()
и уничтожаться в Foo:stop()
или в dtor 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
в dtor FooPrivate
?
Спасибо.