En las clases de C ++, ¿por qué el punto y coma después de la llave de cierre? Regularmente lo olvido y obtengo errores de compilación, y por lo tanto pierdo tiempo. Me parece algo superfluo, lo que es poco probable que sea el caso. ¿Realmente la gente hace cosas como:
class MyClass
{
.
.
.
} MyInstance;
Lo obtengo desde el punto de vista de compatibilidad de C para estructuras y enumeraciones, pero dado que las clases no son parte del lenguaje C, supongo que es principalmente para mantener la coherencia entre construcciones de declaración similares.
Lo que estaba buscando estaba más relacionado con la lógica del diseño que con poder cambiar nada, aunque un buen IDE de finalización de código podría atrapar esto antes de la compilación.
c++
class
oop
declaration
SmacL
fuente
fuente
Respuestas:
El lenguaje requiere el punto y coma después de la llave de cierre en una declaración de tipo. Ha sido así desde las primeras versiones de C.
Y sí, la gente de hecho hace la declaración que acaba de poner allí. Es útil para crear tipos de ámbito dentro de métodos.
void Example() { struct { int x; } s1; s1.x = 42; struct ADifferentType { int x; }; }
En este caso, creo que está claro por qué se necesitan los puntos y coma. En cuanto a por qué es necesario en el caso más general de declarar en el archivo de encabezado, no estoy seguro. Mi conjetura es que es histórico y fue hecho para hacer la escritura más fácil el compilador.
fuente
El enlace proporcionado por @MichaelHaren parece proporcionar la causa raíz . El punto y coma (como han señalado otros) se hereda de C. Pero eso no explica por qué C lo usó en primer lugar. La discusión incluye esta joya de ejemplo:
struct fred { int x; long y; }; main() { return 0; }
Las versiones anteriores de C tenían un tipo de retorno int implícito de una función a menos que se declarara lo contrario. Si omitimos
;
al final de la definición de la estructura, no solo estamos definiendo un nuevo tipofred
, sino que también declaramos quemain()
devolverá una instancia defred
. Es decir, el código se analizaría así:struct fred { int x; long y; } main() { return 0; /* invalid return type, expected fred type */ }
fuente
Supongo que es porque las clases son declaraciones, incluso cuando necesitan llaves para agrupar. Y sí, existe el argumento histórico de que dado que en C puedes hacer
struct { float x; float y; } point;
en C ++ debería poder hacer algo similar, tiene sentido que la
class
declaración se comporte de la misma manera.fuente
Es corto para
class MyClass { . . . }; // instance declaration MyClass MyInstance; // semicolon here
El punto y coma después de las llaves de la declaración de clase en realidad es excesivo, pero así es como se define C ++. El punto y coma después de la declaración de la variable siempre es necesario y tiene sentido.
fuente
No uso tales declaraciones
class MyClass { . . . } MyInstance;
Pero en este caso puedo entender por qué hay punto y coma allí.
Porque es como
int a;
una declaración de variable.Probablemente por coherencia, ya que puede omitir el punto y coma de 'MyInstance' permanece allí.
fuente
Se necesita después de
struct
por razones de compatibilidad, y cómo le gustaría esto:struct MyStruct { ... }; class MyClass { ... } //inconsistency
fuente
namespace myNamespace { ... } // inconsistent but valid
?En C / C ++ el; es un terminador de declaraciones. Todas las declaraciones terminan con; para evitar la ambigüedad (y para simplificar el análisis). La gramática es coherente a este respecto. Aunque una declaración de clase (o cualquier bloque para el caso) tiene varias líneas de longitud y está delimitada con {}, sigue siendo simplemente una declaración (el {} es parte de la declaración), por lo tanto, debe terminarse con; (El; no es un separador / delimitador)
En tu ejemplo
class MyClass{...} MyInstance;
es la declaración completa. Se pueden definir múltiples instancias de la clase declarada en una sola declaración.
class MyClass{...} MyInstance1, MyInstance2;
Esto es completamente consistente con declarar múltiples instancias de un tipo primitivo en una sola declaración:
int a, b, c;
La razón por la que uno no ve a menudo tal desclaración de clase e instancia, es que la instancia podría? Solo? ser una variable global, y realmente no desea objetos globales a menos que sean estructuras estáticas y / o simples de datos antiguos.
fuente