sobrecarga qué poo ejemplos destructores definicion constructores codigo clases c++ constructor standards

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;



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ó?