2012-03-20 6 views
9
#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 * квадрат :: ширина ??

+7

Почему квадрат имеет разную длину и ширину? Вы можете просто использовать 'side'. –

ответ

19

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

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

сделать

return 2*length + 2*width; 

(который неявно такой же, как:

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

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

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

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

Просто используйте

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

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

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

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

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

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

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

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

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

В этом контексте, это то же самое, как:

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

Однако, так как это же объект и тип же, вы можете просто написать:

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

или, наиболее просто:

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

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

так что вы Периметр функция должна быть:

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

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

Смежные вопросы