1

所以我正在从 Stephen Prata 的书中学习 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结构并将valYearvalBottlesNum作为简单的类成员变量并像这样初始化它们......

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

但我真的很想知道如何解决这种问题。

提前感谢!

4

2 回答 2

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它自己的构造函数。

于 2015-03-25T19:44:29.110 回答
1

您尝试使用的valarray构造函数T const*接受数据和一个参数,该std::size_t参数指示第一个参数指向的数组元素的数量。如果您可以使用 C++11,则更yearNum改为std::size_t并且您可以使用list-initialization,这反过来将聚合初始化Pair.

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

现场演示

于 2015-03-25T19:55:51.497 回答