¿Cómo inicializo un miembro de datos de const?

#include 

using namespace std;
class T1
{
  const int t = 100;
  public:
  
  T1()
  {
    cout << "T1 constructor: " << t << endl;
  }
};

Cuando estoy tratando de inicializar const miembro de los datos t con 100. Pero me está dando el siguiente error:

test.cpp:21: error: ISO C++ forbids initialization of member ‘t’
test.cpp:21: error: making ‘t’ static

¿Cómo puedo inicializar un const miembro?

Pregunta hecha hace 11 años, 1 meses, 1 días - Por daniel1


11 Respuestas:

  • El const variable especifica si una variable es modificable o no. El valor constante asignado se utilizará cada vez que se refiera la variable. El valor asignado no puede ser modificado durante la ejecución del programa.

    Bjarne Stroustrup explicación resume brevemente:

    Una clase se declara normalmente en un archivo de cabecera y un archivo de cabecera se incluye típicamente en muchas unidades de traducción. Sin embargo, para evitar reglas complicadas de conexión, C++ requiere que cada objeto tenga una definición única. Esa regla se rompería si C++ permitía la definición en clase de entidades que debían ser almacenadas en la memoria como objetos.

    A const variable tiene que ser declarada dentro de la clase, pero no se puede definir en ella. Necesitamos definir la variable const fuera de la clase.

    T1() : t( 100 ){}
    

    Aquí la asignación t = 100 sucede en la lista de inicializadores, mucho antes de que ocurra la initilización de clase.

    Respondida el Jan 24, 2013 a las 06:58 - por bytebard30f9

    Votos positivos: 0 | Votos negativos: 0

  • Bueno, podrías hacerlo. static:

    static const int t = 100;
    

    o usted podría utilizar un inicializador miembro:

    T1() : t(100)
    {
        // Other constructor stuff here
    }
    

    Respondida el Jan 24, 2013 a las 07:04 - por htmlhelix

    Votos positivos: 0 | Votos negativos: 0

  • Hay un par de maneras de inicializar los miembros del const dentro de la clase..

    Definición de miembro del const en general, necesita inicialización de la variable también..

    1) Dentro de la clase , si quieres inicializar el const la sintaxis es así

    static const int a = 10; //at declaration
    

    2) La segunda manera puede ser

    class A
    {
      static const int a; //declaration
    };
    
    const int A::a = 10; //defining the static member outside the class
    

    3) Bueno, si no quieres inicializar en la declaración, entonces la otra manera es a través del constructor, la variable necesita ser inicializada en la lista de inicialización (no en el cuerpo del constructor). Tiene que ser así

    class A
    {
      const int b;
      A(int c) : b(c) {} //const member initialized in initialization list
    };
    

    Respondida el Jan 24, 2013 a las 07:12 - por codemaestro

    Votos positivos: 0 | Votos negativos: 0

  • Si no quieres hacer el const miembro de la clase estática, Puede inicializar const miembro de datos usando el constructor de la clase. Por ejemplo:

    class Example{
          const int x;
        public:
          Example(int n);
    };
    
    Example::Example(int n):x(n){
    }
    

    si hay múltiples const miembros de datos en clase puede utilizar la siguiente sintaxis para inicializar los miembros:

    Example::Example(int n, int z):x(n),someOtherConstVariable(z){}
    

    Respondida el Jan 24, 2013 a las 07:19 - por pixelpioneerc4b5

    Votos positivos: 0 | Votos negativos: 0

    1. Puede actualizar su compilador para apoyar C+11 y su código funcionaría perfectamente.

    2. Utilice la lista de inicialización en constructor.

      T1() : t( 100 )
      {
      }
      

    Respondida el Jan 24, 2013 a las 07:27 - por bytebard66b1

    Votos positivos: 0 | Votos negativos: 0

  • Otra solución es

    class T1
    {
        enum
        {
            t = 100
        };
    
        public:
        T1();
    };
    

    Así que t es inicializado a 100 y no puede ser cambiado y es privado.

    Respondida el Jan 24, 2013 a las 07:35 - por techsavvypro

    Votos positivos: 0 | Votos negativos: 0

  • Si un miembro es un Array será un poco complejo de lo normal:

    class C
    {
        static const int ARRAY[10];
     public:
        C() {}
    };
    const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
    

    o

    int* a = new int[N];
    // fill a
    
    class C {
      const std::vector v;
    public:
      C():v(a, a+N) {}
    };
    

    Respondida el Jan 24, 2013 a las 07:45 - por codervoyager

    Votos positivos: 0 | Votos negativos: 0

  • Otra manera posible son los espacios de nombres:

    #include 
    
    namespace mySpace {
       static const int T = 100; 
    }
    
    using namespace std;
    
    class T1
    {
       public:
       T1()
       {
           cout << "T1 constructor: " << mySpace::T << endl;
       }
    };
    

    La desventaja es que otras clases también pueden utilizar las constantes si incluyen el archivo de encabezado.

    Respondida el Jan 24, 2013 a las 07:55 - por syntaxsensei8acf

    Votos positivos: 0 | Votos negativos: 0

  • Esta es la manera correcta de hacerlo. Puedes probar este código.

    #include 
    
    using namespace std;
    
    class T1 {
        const int t;
    
        public:
            T1():t(100) {
                cout << "T1 constructor: " << t << endl;
            }
    };
    
    int main() {
        T1 obj;
        return 0;
    }
    

    si estás usando C++10 Compiler or below entonces usted no puede inicializar el miembro del cons en el momento de la declaración. Así que aquí es necesario hacer constructor para inicializar el miembro de datos del const. También debe utilizar la lista de inicializadores T1():t(100) para conseguir memoria al instante.

    Respondida el Jan 24, 2013 a las 08:05 - por logicluminary

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás viendo se debe a que no puedes inicializar un miembro de dato const dentro de la declaración de la clase. En C++, las variables const deben inicializarse en la lista de inicialización del constructor de la clase.

    Aquí tienes cómo puedes corregir tu código para inicializar correctamente el miembro de datos const:

    cpp
    include 
    using namespace std;
    class T1
    {
      const int t;
      public:
    
      T1() : t(100)
      {
        cout << "T1 constructor: " << t << endl;
      }
    };
    
    int main()
    {
      T1 obj;
    }
    

    En este caso, inicializamos el miembro t en la lista de inicialización del constructor T1 usando la sintaxis : t(100). Ahora, cuando creas un objeto de la clase T1, el miembro t se inicializará correctamente con el valor 100.

    Respondida el Jan 25, 2013 a las 07:01 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para inicializar un miembro de datos const, debes inicializarlo en la declaración o en la lista de inicialización del constructor. No puedes inicializarlo en el cuerpo del constructor, como estás intentando hacer en tu ejemplo.

    Aquí tienes un ejemplo de cómo inicializar un miembro de datos const en la declaración:

    cpp
    class T1
    {
      const int t = 100; // Inicializa 't' en la declaración
      public:
    
      T1()
      {
        cout << "T1 constructor: " << t << endl;
      }
    };
    

    También puedes inicializarlo en la lista de inicialización del constructor:

    cpp
    class T1
    {
      const int t; // Declara 't' como 'const'
      public:
    
      T1() : t(100) // Inicializa 't' en la lista de inicialización del constructor
      {
        cout << "T1 constructor: " << t << endl;
      }
    };
    

    En ambos casos, el miembro de datos t se inicializa correctamente con el valor 100.

    Respondida el Jan 25, 2013 a las 07:05 - por Gemini

    Votos positivos: 0 | Votos negativos: 0