首页 > 解决方案 > 私有类实现中的 Pimpl 和指针

问题描述

我有以下Pimpl类,其中类中的一个成员FooPrivate是指向类 A 的指针,该类 A 应该在. 到目前为止,我有这个:Foo:init()Foo:stop()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()创建像and这样的辅助函数是否更干净FooPrivate::stop(),它将从Foo:init()and调用,并且在 dtor 中Foo:stop()删除,而不是?A *aFooPrivate

谢谢你。

标签: c++qtpimpl-idiom

解决方案


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

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

std::unique_ptr<A> a;

推荐阅读