我有以下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;

10-05 23:48