Pimpl和指针在私有类的实现中

时间:2019-05-24 10:04:57

标签: c++ qt pimpl-idiom

我有以下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代替?

谢谢。

1 个答案:

答案 0 :(得分:1)

  

我担心的是A * a的所有权

然后使用智能指针,例如:

std::unique_ptr<A> a;