1. ホーム
  2. c++

[解決済み] C++のWrapperクラスの意味は何ですか?

2022-03-05 19:10:17

質問

ラッパークラスを理解するのに少し苦労しています。どなたか適切な例を示していただけると幸いです。

  1. C++のWrapperクラスとは何ですか、またどのような状況で作成するのですか?
  2. ところで、どんな使い道があるのですか?

ありがとうございます。

解決方法は?

ラッパークラスとは、あるリソースをラップするクラス、つまりリソースを管理するクラスを意味するデファクト・タームです。つまり、ラッパーを書くということは、次のようなことを意味します。

class int_ptr_wrapper
{
public:
    int_ptr_wrapper(int value = 0) :
    mInt(new int(value))
    {}

    // note! needs copy-constructor and copy-assignment operator!

    ~int_ptr_wrapper()
    {
        delete mInt;
    }

private:
    int* mInt;
};

へのポインタを管理("wraps")するクラスです。 int . すべてのリソースは、クリーンさ(明示的なクリーンアップコードやノイズがない)と正確さ(デストラクタの実行が保証されている、クリーンアップを忘れることがない、例外があっても安全)のために、何らかの方法でラップされる必要があります。

このパターンはSBRM(Scoped-bound Resource Management)と呼ばれますが、より一般的な(しかし最も難解な)名前はRAII(Resource-Acquisition is Initialization)です。このアイデアは、リソースのクリーンアップをデストラクタにバインドすることで、上記の理由から、スコープが残りを処理します。

コピーコンストラクタとコピーアサインオペレータがないと言ったことに注意してください。これは ルール・オブ・スリー . (このルールを正しく実装する最も簡単な方法は、コピー&スワップというイディオムで、次のように説明します。 こちら .


時には、リソースのクリーンアップのためにラッパークラスを書くのは現実的ではありません。(あるいはトランザクションプログラミングの場合。) この解決策は スコープガード これは、クリーンアップを必要とする関数の内部にクリーンアップコードを記述する方法です。

より詳しい情報は、お気に入りの検索プロバイダー(つまりGoogle)で検索するか、"primary"のドキュメントにアクセスすると見つかるかもしれません。 こちら . なお、Boostでは ユーティリティ これは、良いイディオムにはたいていそうであるように、です。