Инициализация структуры через список инициализации членов
Итак, я изучаю 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}}
{}