Pimpl и указатели в реализации частного класса - PullRequest
0 голосов
/ 24 мая 2019

У меня есть следующий класс 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?

Спасибо.

1 Ответ

1 голос
/ 24 мая 2019

Меня беспокоит владение A * a

Затем используйте умный указатель, что-то вроде:

std::unique_ptr<A> a;
...