¿Por qué no es posible definir un miembro estático de una clase en la función main () en C ++? Considere este código:

#include <iostream>
using namespace std;
class A
{
    public:
    int a;
    static int b;
    A()
    {
        // int A::b = 1;
    }
    void fun()
    {
        // int A::b = 1;
    }
};
int main() 
{
    A objA;
    int A::b = 1;
    return 0;
}

Salida:

prog.cpp: In function ‘int main()’:
prog.cpp:20:14: error: qualified-id in declaration before ‘=’ token
     int A::b = 1;
              ^

Pero cuando intento hacer lo mismo fuera de la función principal, está funcionando. ¿Cuál es la razón para esto?

c++
0
Aditya 24 ene. 2021 a las 16:28

1 respuesta

La mejor respuesta

¿Por qué no es posible definir un miembro estático de una clase en la función main () en C ++?

C ++ es un lenguaje de tipado estático. Es decir: la "forma" de todas las "cosas" (struct, class, funciones, etc.) debe ser conocida de antemano por el compilador (es decir, estáticamente ) - y debido a razones históricas, C ++ requiere que todos los nombres de tipo y miembros de tipo sean declarados y (excepto para los cuerpos de función miembro) definidos antes de tiempo (eso es lo que {{X2 }} archivos son para).

Si los programas fueran capaces de cambiar la "forma" de algo retroactivamente dentro de una función, entonces sería imposible para el compilador saber cuál es la "forma" de un valor en otra parte del programa (bueno, esto es lo que Los lenguajes escritos dinámicamente como JavaScript, y es por eso que escribir un compilador AOT para ellos es muy difícil).

Un enfoque alternativo, mediante el cual el compilador permite implementaciones de funciones para definir tipos se conoce como Inferencia de tipo Hindley – Milner, sin embargo, C ++ no lo admite.

Observo que el problema irresoluble con implementaciones ingenuas de Hindley-Milner es que es imposible para el compilador determinar si una referencia, no declarado, el miembro debe contar como una nueva declaración, o como un error: dado su programa, si tuviera que escribir con el dedo gordo y escribir int A::B = 1; en lugar de int A::b = 1 si el compilador le da un error ¿O debería definir B además de b? Si le da un error , ¿cómo puede saber si B o b deberían ser el miembro correcto?

4
Dai 24 ene. 2021 a las 13:51