ホームページ > バックエンド開発 > C++ > C で不完全な型で `std::unique_ptr` を使用するにはどうすればよいですか?

C で不完全な型で `std::unique_ptr` を使用するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-07 10:48:13
オリジナル
722 人が閲覧しました

How Can I Use `std::unique_ptr` with Incomplete Types in C  ?

不完全な型で std::unique_ptr を使用する

pimpl イディオムでは、不完全な型で std::unique_ptr を使用するとコンパイルが発生する可能性がありますエラー。次のコードを考えてみましょう。

class window {
  window(const rectangle& rect);

private:
  class window_impl; // defined elsewhere
  std::unique_ptr<window_impl> impl_; // won't compile
};
ログイン後にコピー

エラーは通常、 に見られるように、不完全な型に対して sizeof を使用しようとしたときに発生します。行 304.

問題

この問題は、コンパイラが std:: の割り当てを決定するために不完全型のサイズを知る必要があるという事実から生じます。 unique_ptr。この情報は利用できないため、コンパイル エラーが発生します。

解決策

この問題に対処するには、unique_ptr を保持するクラスのデストラクターを実装することが不可欠です。これは、コンパイラーによって生成されるデフォルトのデストラクターには型の完全な宣言が必要なためです。以下に例を示します。

class foo {
    class impl;
    std::unique_ptr<impl> impl_;

public:
    foo(); // You may need a def. constructor to be defined elsewhere

    ~foo(); // Implement (with {}, or with = default;) where impl is complete
};
ログイン後にコピー

デストラクターを実装することにより、コンパイラーは unique_ptr の破棄を処理するために必要な知識を取得します。

特殊なケース

特定のシナリオでは、不完全な型で unique_ptr を使用できない場合があります。可能:

  • テンプレート コンストラクター: クラスにテンプレート コンストラクターがある場合、コンパイラーは構築時の潜在的な例外と破棄の処理方法を決定するために完全な型を必要とします。
  • 静的期間オブジェクト: コンパイラは破棄方法を知る必要があるため、名前空間スコープで unique_ptr を使用すると失敗する可能性があります。静的な期間オブジェクト。このような場合の回避策は、デストラクターを使用してヘルパー クラスを定義することです。
class impl;
struct ptr_impl : std::unique_ptr<impl> {
    ~ptr_impl(); // Implement (empty body) elsewhere
} impl_;
ログイン後にコピー

これらのガイドラインに従うことで、不完全な型で unique_ptr を効果的に使用でき、スムーズなコンパイル プロセスを保証できます。

>

以上がC で不完全な型で `std::unique_ptr` を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート