Ошибка: ожидаемое имя члена или «;» после того, как спецификаторы объявления и конструктор должны явно инициализировать const - PullRequest
0 голосов
/ 23 сентября 2019

Я получаю эти ошибки при запуске кода:

ожидаемое имя члена или ';'после объявления спецификаторов
конструктор для 'Rectangle' должен явно инициализировать константный член 'width'

Это может быть из-за моего незнания классов, но я не знаю, что еще делать.

Вот класс, в котором ошибка:

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 голосов
/ 23 сентября 2019
className(type1 arg1, type2 arg2):member1(arg1), member2(arg2) 
{
    // constructor body
}

Это называется списком инициализаторов в c ++.member1 (arg1) и member2 (arg2) не являются функциями.

Просто инициализируют элементы данных переданными значениями.Так что вам просто нужно удалить их {} в конце списка инициализатора, и ваш код будет работать нормально.

0 голосов
/ 23 сентября 2019

У вас есть опечатка в конце длинной строки, есть дополнительная {}.Удалите их, и он должен скомпилироваться.

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.В то время как с неконстантной версией вам вообще ничего не нужно писать, потому что сгенерированный неявно operator= будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...