Ожидаемое первичное выражение перед '.'

#include <iostream>
using std::cout;
using std::endl;

class square {

public:
    double length, width;

    square(double length, double width);
    square();

    ~square();

    double perimeter();
};

double square::perimeter() {
return 2*square.length + 2*square.width;
}

int main() {

square sq(4.0, 4.0);

cout << sq.perimeter() << endl;

return 0;
}

Я пытаюсь написать простую программу класс. Я получаю ошибку

в функции-члене ' двойной квадрат:: периметр ()'; .cpp: 21: ошибка: ожидаемое первичное выражение перед '.' знак .cpp: 21: ошибка: ожидаемое первичное выражение перед '.- токен!--2-->

означает ли это, что я должен использовать 2*square::length + 2*square::width??

6 ответов


square - это тип, а не объект; вместо

return 2*square.length + 2*square.width;

do

return 2*length + 2*width;

(что неявно совпадает с:

return 2*this->length + 2*this->width;

что вы можете, или пожалуйста может и нет, предпочитаю для ясности).

2*square::length + 2*square::width будет действительный синтаксис if length и width были

  • static члены square или
  • членов базового класса square или
  • объектов в некотором пространстве имен square

да, точная форма будет такой:

return 2*square::length + 2*square::width;

С square - это тип, а не объект.

в этом контексте, это то же, что:

return 2*this->square::length + 2*this->square::width;

однако, с то же самое


просто использовать

double square::perimeter() {
    return 2 * length + 2 * width;
}

double square::perimeter() {
    return 2*square.length + 2*square.width;
}

вы должны сказать square::perimeter() потому что вы определяете метод самого квадратного класса. Может показаться, что вы хотите определить его на конкретном объекте, но вы хотите, чтобы он был доступен для всех экземпляров square, поэтому вам нужно определить его на конкретном.

переменные экземпляра length и width С другой стороны, относятся к конкретному экземпляру класса, а не ко всему классу (иначе вы объявили бы их как static). Это значит, что ты можно просто ссылаться на них напрямую, а не проходить через сам класс, и компилятор будет знать, о каких переменных вы говорите. Это потому что width и length определяются в той же области, что и метод, поэтому вам не нужно давать ему специальные указания с :: чтобы сказать ему, где найти то, что он ищет. Таким образом:

double square::perimeter() {
    return 2 * length + 2 * width; //will refer to the instance variables automatically
}

чтобы получить доступ к переменным экземпляра, просто назовите их:

double square::perimeter() {
  return 2*length + 2*width;
}

double square::perimeter() {
return 2*square.length + 2*square.width;
}

что такое square в этой функции? квадрат-это класс. вы используете . оператор доступа к членам объектов. как sq.somefun();

таким образом, функция периметра должна быть:

 double square::perimeter() {
    return (2*(length + width));
    }

но разве длина и ширина квадрата равны?