错误:声明说明符和构造函数之后,预期成员名称或“;”必须显式初始化const

时间:2019-09-23 04:37:12

标签: c++ class constructor

运行代码时出现这些错误:

  

期望的成员名称或“;”声明后声明符
  “矩形”的构造函数必须显式初始化const成员“宽度”

这可能是由于我缺乏课堂知识,但是我不知道该怎么做。

这里是错误所在的类:

class Rectangle
{
    const double length;
    const double width;
public:
    Rectangle(const vector<string> &internal) : length(internal.size() >= 2 ? atof(internal[1].c_str()) : 0) {},
    width(internal.size() >= 3 ? atof(internal[2].c_str()) : 0) {};

    Rectangle& operator = (const Rectangle&);
    void outputRectangle(ostream&) const;
};

2 个答案:

答案 0 :(得分:0)

您在长线的结尾附近有一个错字,还有一个额外的{}。删除这些,它应该可以编译。

IMO,最好使用具有返回矩形的函数的代码样式,而不是将逻辑打包到构造函数中。示例:

class Rectangle
{
    const double length;
    const double width;
public:
    Rectangle(double length, double width): length(length), width(width) {}
    void outputRectangle(ostream&) const;
};

Rectangle make_rectangle(const vector<string> &internal)
{
    double length = 0.0, width = 0.0;
    if ( internal.size() > 2 )
        width = std::stod(internal[2]);
    if ( internal.size() > 1 )
        length = std::stod(internal[1]);

    return { length, width };
}

我还建议让outputRectangle是一个自由函数,并且成员变量应为非{const。人们可以通过声明const Rectangle来简化生活。

例如,当这些成员为Rectangle& operator= (const Rectangle&);时,实际上无法实现建议的功能const。对于非const版本,您根本不需要编写任何东西,因为隐式生成的operator=可以使用。

答案 1 :(得分:0)

className(type1 arg1, type2 arg2):member1(arg1), member2(arg2) 
{
    // constructor body
}

这在c ++中称为初始化列表。 member1(arg1)和member2(arg2)不是函数。

只需使用传递的值初始化数据成员。因此,您只需要删除初始化程序列表末尾的{},代码就可以正常工作。