¿Método de clase y variable con el mismo nombre, error de comstackción en C ++ no en Java?

class Test { bool isVal() const { return isVal; } private: bool isVal; }; 

Al comstackr este archivo, dice

testClass.cpp: 9: statement de `bool Test :: isVal ‘

testClass.cpp: 3: conflictos con la statement previa `bool Test :: isVal () ‘

Aunque lo mismo funcionaría para Java

 class Test { private boolean isVal; public boolean isVal() { return isVal; } } 

No estoy seguro de por qué C ++ no puede manejar esto.

Porque C ++ no es Java. Puede tomar la dirección de un miembro:

 &Test::isVal 

Por lo tanto, no puede tener dos miembros con el mismo nombre, excepto que puede sobrecargar las funciones de los miembros. Incluso si pudieras eliminar la ambigüedad por algún tipo de yeso, el siguiente problema ya surgiría en otros lugares.

En C ++, mucha gente, incluyéndome a mí, generalmente llama a los miembros de datos especialmente, como poner una m antes de su nombre. Esto evita el problema:

 class Test { public: bool IsVal() const { return mIsVal; } private: bool mIsVal; }; 

C ++ aplica el nombre que cambia a nombres de funciones y variables globales. Las variables locales no se destrozan. El problema surge porque en C puede acceder a la dirección de una variable o una función (también en C ++), por ejemplo:

 struct noob{ bool noobvar; void noobvar(){}; }; 

Uno puede decir, ¿por qué no aplicar el nombre también a las variables locales y luego tener una representación local interna como

 bool __noobvar_avar; void __noobvar_void_fun; 

y supongamos que reciben las direcciones durante la ejecución 0x000A y 0x00C0 respectivamente.

Sin embargo, si escribimos en algún lugar del código:

 &noob::noobvar 

¿Qué debería hacer el progtwig?

  1. devuelve la dirección de la variable noobvar, es decir, 0x000A
  2. devuelve las direcciones de la función noobvar, es decir, 0x00C0

Puede ver que, dado que en C, y por lo tanto en C ++, puede emitir una “dirección de”, no es legal tener variables y funciones con el mismo nombre dentro del mismo ámbito de resolución.

Las funciones en c / c ++ son simplemente punteros a una ubicación en la memoria donde se encuentra el código, isVal (como booleano) y isVal (como una función) son por lo tanto ambiguas.

La respuesta rápida es “porque esa es la forma en que C ++ funciona”. C ++ no tiene un espacio de nombre separado para las variables miembro y las funciones miembro (es decir, “métodos”) donde Java (aparentemente, como no lo he probado) lo hace.

En cualquier caso, recuerde la vieja historia sobre el tipo que fue a un médico y le dijo “Doc, duele cuando hago esto “. A lo que el doctor respondió “bueno, ¡no hagas eso!” Esta es una peculiaridad del lenguaje en su camino para convertirse en un truco de progtwigdor tonto.

La siguiente sección del C ++ Draft Standard N3337 especifica cuándo se puede sobrecargar un nombre.

13 Sobrecarga

1 Cuando se especifican dos o más declaraciones diferentes para un solo nombre en el mismo ámbito, se dice que ese nombre está sobrecargado . Por extensión, dos declaraciones en el mismo ámbito que declaran el mismo nombre pero con diferentes tipos se llaman declaraciones sobrecargadas . Solo las declaraciones de plantilla de función y función pueden sobrecargarse; las declaraciones de variables y tipos no se pueden sobrecargar.

Cuando defines una clase como:

 class Test { bool isVal() const { return isVal; } private: bool isVal; }; 

está sobrecargando el nombre isVal dentro del scope de la clase. Tal sobrecarga solo se permite cuando isVal es una función miembro. No está permitido cuando isVal es una variable miembro.

Si tiene alguna razón para usar los mismos nombres para la variable y el método (tal vez reducir el nombre para las cosas tienen casi el mismo propósito, etc.), sugiero que simplemente los nombre con diferentes casos:

 class Test { private bool isVal; public bool ISVAL() { return isVal; } }