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];

};
Другие вопросы по тегам