首页 >后端开发 >C++ >如何在 C 中将 `std::unique_ptr` 与不完整类型一起使用?

如何在 C 中将 `std::unique_ptr` 与不完整类型一起使用?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-07 10:48:13742浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn