【问题标题】:C++11: How to initialize array of pointers of some class with nullptr?C++11:如何用 nullptr 初始化某个类的指针数组?
【发布时间】:2016-03-07 17:06:33
【问题描述】:

我是 C++ 新手。我的班级名为MyDate。此外,我有一个名为Calendar 的类,它有一个指向MyDate 对象的指针数组的成员类型。我应该如何在Calendar的构造函数中声明并初始化数组成员为nullptr

【问题讨论】:

  • 看看你是否可以首先避免使用这个指针数组

标签: c++ c++11 nullptr


【解决方案1】:

智能指针默认初始化为nullptr

class Calendar
{
    std::array<std::unique_ptr<Date>, 42> m_dates;
};

否则,std::array 是一个聚合,因此一个空的大括号初始化列表将对所有标量字段进行零初始化:

class Calendar
{
    std::array<Date *, 42> m_dates {};
};

【讨论】:

  • 确实,根据 Clang 和 GCC,您似乎是正确的。但是,要解决-Wmissing-field-initializers 警告,最好使用std::array&lt;Date *, 42&gt; m_dates {{nullptr}};
【解决方案2】:

就个人而言,我可能会这样做:

class Calendar {

/* Methods: */

    Calendar() noexcept
    { for (auto & ptr: m_dates) ptr = nullptr; }

/* Fields: */

    /* Array of 42 unique pointers to MyDate objects: */
    std::array<MyDate *, 42> m_dates;

};

PS:您可能需要考虑使用智能指针,例如 std::unique_ptrstd::shared_ptr,而不是原始指针。那么你根本不需要在 Calendar 构造函数中显式初始化它们:

class Calendar {

/* Fields: */

    /* Array of 42 pointers to MyDate objects: */
    std::array<std::unique_ptr<MyDate>, 42> m_dates;

};

编辑:如果没有 C++11 功能,我会这样做:

class Calendar {

/* Methods: */

    Calendar()
    { for (std::size_t i = 0u; i < 42u; ++i) m_dates[i] = NULL; }

/* Fields: */

    /* Array of 42 unique pointers to MyDate objects: */
    MyDate * m_dates[42];

};

【讨论】:

  • std::array&lt;MyDate *, 42&gt; m_dates {}; 要简单得多
  • @jotik- 我应该为 nullptr 包含一些特殊的库吗?
  • @saritrotshild 不,它是一个 C++11 特性。但是对于std::array,您需要#include &lt;array&gt;,对于std::unique_ptr/std::shared_ptr,您需要#include &lt;memory&gt;
  • @jotik- 我收到 2 个错误。错误:1。 #error 此文件需要对 ISO C++ 2011 标准的编译器和库支持。此支持目前是实验性的,必须使用 -std=c++11 或 -std=gnu++11 编译器选项启用。 2.错误:命名空间'std'中的'array'没有命名类型。
  • 似乎您有一个不完全支持 C++11 的旧编译器。由于 nullptrstd::arraystd::unique_ptr/std::shared_ptr 是 C++11 功能,因此您必须使用支持 C++11 的编译器。如果你想使用 C++03 或更早版本,你不应该在原始问题中使用nullptr,而是使用NULL。在这种情况下,必须重新标记问题等。我在答案中添加了早期 C++ 版本的示例。
猜你喜欢
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
相关资源
最近更新 更多