qué - poo c++ ejemplos
¿No hay paréntesis en un constructor sin argumentos, un estándar de lenguaje? (8)
Estaba compilando un programa C ++ en Cygwin usando g ++ y tenía una clase cuyo constructor no tenía argumentos. Tenía las líneas:
MyClass myObj();
myObj.function1();
Y cuando intento compilarlo, recibí el mensaje:
error: request for member ''function1'' in ''myObj'', which is of non-class type ''MyClass ()()''
Después de investigar un poco, descubrí que la solución era cambiar esa primera línea para
MyClass myObj;
Podría jurar que ya hice declaraciones de constructores vacías con paréntesis en C ++. ¿Es esto probablemente una limitación del compilador que estoy usando o el estándar de lenguaje realmente dice que no use paréntesis para un constructor sin argumentos?
Aunque MyClass myObj();
podría analizarse como una definición de objeto con un inicializador vacío o una declaración de función; el estándar de lenguaje especifica que la ambigüedad siempre se resuelve a favor de la declaración de la función. Se permite un inicializador de paréntesis vacío en otros contextos, por ejemplo, en una new
expresión o la construcción de un valor temporal inicializado .
El estándar no requiere paréntesis.
int* x = new int;
es sintaxis legal
En tu caso myclass myobj();
es un prototipo de función. Considerando que myclass myobj;
es una variable
Encontré esto en el estándar de C ++ (§8.5.8):
Un objeto cuyo inicializador es un conjunto vacío de paréntesis, es decir, (), se inicializará en valor.
[Nota: dado que () no está permitido por la sintaxis para el inicializador,
X a ();
no es la declaración de un objeto de clase X, sino la declaración de una función que no toma ningún argumento y devuelve una X. La forma () está permitida en otros contextos de inicialización (5.3.4, 5.2.3, 12.6.2). -finalizar nota]
Este es un problema bastante conocido y no depende del compilador. Esencialmente, lo que estabas haciendo era declarar una función que retornaba tipo MyObj. No es sorprendente que no puedas llamar a su constructor. Ver el C ++ faq lite para una buena explicación
Esto se llama el problema analizador más irritante. Cuando el analizador ve
MyClass myObj();
Cree que está declarando una función llamada myObj
que no tiene parámetros y devuelve un MyClass
.
Para evitarlo, usa:
MyClass myObj;
Sin embargo, otro éxito más parásito. Ver por ejemplo , ¿la función de clasificación no funciona con el objeto de función creado en la pila?
Su línea hace que el compilador crea que está declarando una función llamada myObj
que no toma argumentos y devuelve un MyClass
. Esta resolución de ambigüedad es realmente molesta.
MyClass myObj();
Eso se analiza como una declaración de función, la función se llama myObj, no toma argumentos y devuelve el objeto MyClass. Nunca he visto un compilador que acepte eso. Por otro lado MyClass* myPtr = new MyClass();
es aceptable, puede ser que te confundió?