【发布时间】:2016-03-07 17:06:33
【问题描述】:
我是 C++ 新手。我的班级名为MyDate。此外,我有一个名为Calendar 的类,它有一个指向MyDate 对象的指针数组的成员类型。我应该如何在Calendar的构造函数中声明并初始化数组成员为nullptr?
【问题讨论】:
-
看看你是否可以首先避免使用这个指针数组
我是 C++ 新手。我的班级名为MyDate。此外,我有一个名为Calendar 的类,它有一个指向MyDate 对象的指针数组的成员类型。我应该如何在Calendar的构造函数中声明并初始化数组成员为nullptr?
【问题讨论】:
智能指针默认初始化为nullptr:
class Calendar
{
std::array<std::unique_ptr<Date>, 42> m_dates;
};
否则,std::array 是一个聚合,因此一个空的大括号初始化列表将对所有标量字段进行零初始化:
class Calendar
{
std::array<Date *, 42> m_dates {};
};
【讨论】:
-Wmissing-field-initializers 警告,最好使用std::array<Date *, 42> m_dates {{nullptr}};
就个人而言,我可能会这样做:
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_ptr 或 std::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<MyDate *, 42> m_dates {}; 要简单得多
std::array,您需要#include <array>,对于std::unique_ptr/std::shared_ptr,您需要#include <memory>。
nullptr、std::array 和 std::unique_ptr/std::shared_ptr 是 C++11 功能,因此您必须使用支持 C++11 的编译器。如果你想使用 C++03 或更早版本,你不应该在原始问题中使用nullptr,而是使用NULL。在这种情况下,必须重新标记问题等。我在答案中添加了早期 C++ 版本的示例。