首頁 > 後端開發 > C++ > 為什麼 Pimpl Idiom 中的'std::unique_ptr”因類型不完整而失敗?

為什麼 Pimpl Idiom 中的'std::unique_ptr”因類型不完整而失敗?

DDD
發布: 2024-12-13 05:01:11
原創
456 人瀏覽過

Why Does `std::unique_ptr` Fail with Incomplete Types in Pimpl Idiom?

std::unique_ptr 和不完整類型:深入了解

考慮使用 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'對不完整類型'uixx::window::window_impl'的無效應用”
傳統上,std::unique_ptr 與不完整型別相容。那麼,問題出在哪裡呢?

問題的癥結:破壞

關鍵在於破壞。如果 pimpl 與 unique_ptr 一起使用,則必須明確聲明析構函數:

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

public:
    foo(); // Constructor may need external definition

    ~foo(); // Implement (braceless or with = default;) once impl is complete
};
登入後複製
如果沒有,編譯器會產生一個預設析構函數,需要完整聲明 foo::impl。

模板問題和靜態持續時間實例

使用模板建構函數,即使impl_ 成員未建構:

template <typename T>
foo::foo(T bar) {
    // Compiler requires knowledge of impl_ destruction at compile time!
}
登入後複製
此外,在命名空間成員未建構:

class impl;
std::unique_ptr<impl> impl_;
登入後複製
此外,在命名空間範圍內使用具有不完整類型的unique_ptr會失敗:

class impl;
struct ptr_impl : std::unique_ptr<impl> {
    ~ptr_impl(); // Implement (empty body) elsewhere
} impl_;
登入後複製
編譯器需要知道如何銷毀此靜態持續時間物件。解決方法包括定義自訂類型:

以上是為什麼 Pimpl Idiom 中的'std::unique_ptr”因類型不完整而失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板