2012-03-20 20 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; 
} 

Estoy tratando de escribir un programa de clase simple. Obtengo el errorExpresión primaria esperada antes de '.'

en la función miembro 'double square :: perimeter()'; .cpp: 21: error: expresión primaria esperada antes de '.' token .cpp: 21: error: expresión primaria esperada antes de '.' token

¿Esto significa que tengo que usar 2 * square :: length + 2 * square :: width ??

+7

¿Por qué un cuadrado tiene una "longitud" y un "ancho" diferente? Podrías usar 'side'. –

Respuesta

19

square es una tipo, no un objeto; en lugar de

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

hacer

return 2*length + 2*width; 

(que es implícitamente lo mismo que:

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

que puede, o favor puede que no, preferiría para mayor claridad).

2*square::length + 2*square::width habría sintaxis válida si length y width eran

  • estáticas miembros de square, o
  • miembros de alguna clase base square, o
  • objetos en algún espacio de nombres square
3

simplemente usar

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

para acceder a las variables de instancia, sólo el nombre de ellas:

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

que necesita decir square::perimeter() porque está definiendo un método de la propia clase cuadrado. Puede parecer que desea definirlo en un objeto específico, pero desea que esté disponible para todas las instancias de cuadrado, por lo que debe definirlo en un objeto específico.

Las variables de instancia y lengthwidth por el contrario, pertenecen a una instancia específica de una clase y no a toda la clase en sí (lo contrario sería declarar como static). Esto significa que puede referirse a ellos directamente en lugar de pasar por la clase en sí, y el compilador sabrá de qué variables está hablando. Esto se debe a que width y length se definen en el mismo ámbito que el método, por lo que no necesita darle instrucciones especiales con :: para indicarle dónde encontrar lo que está buscando.Por lo tanto:

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

Sí, la forma exacta sería:

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

desde square es un tipo, no un objeto.

En este contexto, es lo mismo que:

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

Sin embargo, ya que es la misma objeto y el tipo misma, sólo puede escribir:

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

o, lo más simple:

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

¿cuál es el square en esta función? cuadrado es una clase. utiliza el operador . para acceder a miembros desde objetos. como sq.somefun();

perímetro para que la función debe ser:

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

Pero no es el largo y el ancho de igual cuadrado?

Cuestiones relacionadas