Инициализация структуры через список инициализации членов

Итак, я изучаю C++ из книги Стивена Прата и хочу выполнить одно упражнение... Итак, проблема в следующем:

Я хочу использовать std::valarray внутри структуры, внутри такого класса:

class Wine
{
private:
    struct Pair
    {
        std::valarray<int> valYear;
        std::valarray<int> valBottlesNum;
    };
    int m_yearNum;
    Pair m_numericData;
public:
    Wine();
    Wine(int, const int[], const int[]);
};

И инициализировать это через список инициализации члена:

Wine::Wine(int yearNum, const int year[], const int bottlesNum[])
    : m_yearNum(yearNum), 
    m_numericData.valYear(yearNum, year), 
    m_numericData.valBottlesNum(yearNum, bottlesNum)
{}

Но это просто не хочет работать. Каким-то образом компилятору это не нравится "." для доступа к членам структуры m_numericData в списке инициализатора.

Я мог бы просто отказаться от структуры Pair и сделать valYear и valBottlesNum как простые переменные-члены класса и инициализировать их следующим образом...

Wine::Wine(, int yearNum, const int year[], const int bottlesNum[])
    : m_yearNum(yearNum), m_valYear(yearNum, year), m_valBottlesNum(yearNum, bottlesNum)
{}

но я действительно хочу знать, как решить такие вещи.

Спасибо в преддверии!

2 ответа

Решение

Вы можете переместить отдельные инициализации в тело конструктора:

Wine::Wine(int yearNum, const int year[], const int bottlesNum[])
    : m_yearNum(yearNum)
{
    m_numericData.valYear = std::valarray<int>(yearNum, year);
    m_numericData.valBottlesNum = std::valarray<int>(yearNum, bottlesNum);
}

В качестве альтернативы, дать Pair свой конструктор.

valarray Конструктор, который вы пытаетесь использовать, занимает T const* к данным и std::size_t аргумент, указывающий количество элементов массива, на которое указывает первый аргумент. Если вы можете использовать C++11, то измените yearNum в std::size_t и вы можете использовать список-инициализацию, которая в свою очередь будет агрегировать инициализацию Pair,

Wine::Wine(std::size_t yearNum, const int year[], const int bottlesNum[])
    : m_yearNum(yearNum)
    , m_numericData{{year, yearNum}, {bottlesNum, yearNum}}
{}

Живая демо

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