0

ウィキペディアは、不透明なポインターに関する記事で、次のように主張しています。

dポインターは、クラスの唯一のプライベートデータメンバーであり、構造体のインスタンスを指します(構造体は表示されないため、PODである必要があります)。

これはPIMPLでは必須ではなく、ウィキペディアは一般的に特異なものですよね。

私は私の質問への答えとしてd-pointerタグの欠如をとっていますが、誰かがウィキペディアに貢献したり、物事を明確にしたりすることを望んでいます。または、ウィキペディアがひどい、最後の手段などだと言ってください:)

私の質問のポイントは、cpp実装ファイルで完全に宣言および定義されたときに、ネストされたクラスのメソッドがどの程度表示されるかということです。そのデストラクタは期待どおりに呼び出されますか(包含クラスはそのデストラクタでdeleteを呼び出します)?

_編集_ 修正バージョン、http://en.wikipedia.org/wiki/Opaque_pointer

4

2 に答える 2

4

PIMPLは嫌なイディオムであり、私はそれがよりアンチパターンであるという結論に達しました。

ただし、それを使用することを主張する場合は、実装ファイルでデストラクタを空として簡単に定義して、POD以外の実装を自動的に破棄するために使用するスマートポインタを最大限に活用できます。

class Impl;
class Object {
    std::unique_ptr<Impl> impl;
public:
    //...
    ~Object();
};

#include "Impl.h"
// in cpp
Object::~Object() {}

この簡単なコードサンプルは、ウィキペディアを完全に間違っていると明確に定義しています。実装ファイルでデストラクタを定義するだけで、完全な定義を必要とするスマートポインタであっても、必要なデストラクタを使用できます。

于 2011-08-23T11:56:22.960 に答える
3

うん、それは明らかに間違っている。PIMPL構造体のデストラクタは、クラス自体のデストラクタの定義から、呼び出されたポイントで表示される必要があります。両方のデストラクタを同じ.cppファイルに配置します。最初にPIMPLdtorを使用すると、可視性が保証されます。

PIMPL dtorは他の場所では呼び出されないため、他の場所で表示される理由はありません。

于 2011-08-23T11:59:42.403 に答える