C++11: Как инициализировать массив указателей некоторого класса с помощью nullptr?
Я новичок в C++. У меня есть класс по имени MyDate
, Кроме того, у меня есть класс с именем Calendar
который имеет тип члена массива указателей на MyDate
объекты. Как я должен объявить и инициализировать членов массива nullptr
в конструкторе Calendar
?
2 ответа
Умные указатели по умолчанию инициализировать в nullptr
:
class Calendar
{
std::array<std::unique_ptr<Date>, 42> m_dates;
};
Иначе, std::array
является агрегатом, поэтому пустой фигурный список инициализации будет инициализировать нулями все скалярные поля:
class Calendar
{
std::array<Date *, 42> m_dates {};
};
Лично я бы, наверное, сделал это так:
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];
};