Foros del Web » Programación para mayores de 30 ;) » C/C++ »

error en codigo

Estas en el tema de error en codigo en el foro de C/C++ en Foros del Web. hola estoy haciendo un codigo y en el proceso me sale este error [C++ Error] Unit1.cpp(34): E2233 Cannot initialize a class member here el cual ...
  #1 (permalink)  
Antiguo 21/03/2010, 21:49
 
Fecha de Ingreso: marzo-2010
Mensajes: 2
Antigüedad: 14 años, 1 mes
Puntos: 0
Mensaje error en codigo

hola estoy haciendo un codigo y en el proceso me sale este error

[C++ Error] Unit1.cpp(34): E2233 Cannot initialize a class member here

el cual es de esta linea de codigo:

const int estudiante=10;

como puedo hacer para que lo reconosca o que deje de salir este error
  #2 (permalink)  
Antiguo 22/03/2010, 09:20
 
Fecha de Ingreso: diciembre-2007
Ubicación: Valencia
Mensajes: 92
Antigüedad: 16 años, 4 meses
Puntos: 3
Respuesta: error en codigo

Cita:
Iniciado por carlos0389 Ver Mensaje
hola estoy haciendo un codigo y en el proceso me sale este error

[C++ Error] Unit1.cpp(34): E2233 Cannot initialize a class member here

el cual es de esta linea de codigo:

const int estudiante=10;

como puedo hacer para que lo reconosca o que deje de salir este error

En primer lugar intentare ayudarte haciendo un analisis lo mejor k pueda. No aseguro nada xDD


Unit1.cpp(34): E2233 Cannot initialize a class member here.

Lo apaso por Google Traductor...
(así si sale mal la traduccion es culpa d Google xDD)

Unit1.cpp (34): E2233 No se puede inicializar un miembro de la clase aquí.

La traducción no nos ayuda casi nada.
Digamos que en el Unit1.cpp utilizas alguna clase que no esta inicializada, o que dicha clase esta creada sin un contructor cosa que es posible..

Por otro lado indicas la sentencia
Código:
  const int estudiante=10;
La cual dudo , aun que me puedo confundir que este mal.

No estoy seguro la verdad. Jej
De todos modos me gustaria que mas gente participase para acabar sabiendo que significa ese error. xDD
  #3 (permalink)  
Antiguo 22/03/2010, 13:15
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: error en codigo

Haz la inicializacion de la constante en el constructor de la clase.

Código C++:
Ver original
  1. class C
  2. {
  3.     const int i;
  4.  
  5.     C() : i(10)
  6.     {
  7.     }
  8. };

Hacerlo en otro lugar no esta permitido en C++. En esto, la sintaxis difiere de otros lenguajes como java, que sí permiten la inicialización afuera del código del constructor.
  #4 (permalink)  
Antiguo 22/03/2010, 14:04
 
Fecha de Ingreso: diciembre-2007
Ubicación: Valencia
Mensajes: 92
Antigüedad: 16 años, 4 meses
Puntos: 3
Respuesta: error en codigo

Una costante no se inicializa, olvidate d la constante porque en ella a priori no hay error.

Ejm:. Class Pila

Pila.h
Código:
typedef int Valor ;
class Pila
{
  public:
      Pila(); // <<--- Este es el constructor
      bool Apilar(Valor x);
      bool Desapilar();
      bool Cimapila(Valor & y);    
      bool Pilavacia(); 
      ~Pila();
      void Visualiza();
  private: 
      struct Nodo;      
      typedef Nodo * Puntero;  
      struct Nodo
      {
         Valor info;
         Puntero sig;    
      };
      Puntero cima;
     void Vaciar();
};

Constructor


Pila.cpp
Código:
#include "Pila.h"

Pila::Pila()
{
  cima = NULL;           
}
...
...




"Cannot initialize a class member here"
Es que realmente nunca lo he visto el error
pero este significa "no puede ser inicializado la clase"
quizas un problema de enlace de ficheros... no se la verdad.

No lo se lo siento...
  #5 (permalink)  
Antiguo 22/03/2010, 14:38
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: error en codigo

El codigo que esta al interior de las llaves del constructor se ejecuta despues de haber construido el objeto, es debido a esto que se usa

Código C++:
Ver original
  1. class C
  2. {
  3.     const int i;
  4.  
  5.     C() : i(10)     // <-- antes de las llaves,
  6.                     //     momento correcto para inicializar constantes
  7.     {
  8.     }
  9. };

y no

Código C++:
Ver original
  1. class C
  2. {
  3.     const int i;
  4.  
  5.     C()
  6.     {
  7.         i = 10;     // <-- despues de las llaves, objeto ya construido,
  8.                     //     error de compilacion
  9.     }
  10. };

"Una constante no se inicializa" es una mala regla. De hecho eso es lo que hace que una constante lo sea. La inicializacion. Lo que no puede hacerse es asignar un valor posterior a la inicializacion, que no es lo que se esta haciendo en el codigo mostrado al principio, pues esto se ejecuta en el momento de la construccion.

Última edición por CalgaryCorpus; 22/03/2010 a las 14:50
  #6 (permalink)  
Antiguo 22/03/2010, 14:51
 
Fecha de Ingreso: diciembre-2007
Ubicación: Valencia
Mensajes: 92
Antigüedad: 16 años, 4 meses
Puntos: 3
Respuesta: error en codigo

Cita:
Iniciado por CalgaryCorpus Ver Mensaje

"Una constante no se inicializa" es una mala regla. De hecho eso es lo que hace que una constante lo sea. La inicializacion. Lo que no puede hacerse es asignar un valor posterior a la inicializacion, que no es lo que se esta haciendo en el codigo mostrado al principio, pues esto se ejecuta en el momento de la construccion.
Cierto , quizas no utilice una termilogia correcta, pero me referia a que una contante no se inicializaba en el contructor porque se supone k la constante ya debe tener un valor el cual debe ser invariable en la ejecución del programa.

Teoria de Clases
http://informatica.uv.es/iiguia/AED/...ED.Tema.10.pdf


Segun he estudiado , una clase en C++ se implementaria con 2 ficheros un .h donde unicamente se encuentra la clase en si y un .cpp donde se alojan todos los metodos.


.h
Código C++:
Ver original
  1. const int CONSTANTE = 100; // la constante quizás la posicionaria fuera.
  2. class C
  3. {
  4.     public: //metodos
  5.  
  6.     private: //metodos privados y variables a las que no se debe acceder
  7.  
  8.  
  9. };

.cpp
Código C++:
Ver original
  1. #include  ".h"
  2.  
  3. C::C() // CONSTRUCTOR
  4. {
  5.  
  6. }
  #7 (permalink)  
Antiguo 22/03/2010, 14:57
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: error en codigo

Las constantes pueden estar fuera o dentro de las clases.

La diferencia al ponerla al interior de la clase es el scope de la misma.
No podras acceder a su valor desde funciones al exterior de la clase, si la constante no es marcada como public, y aunque lo fuera, tienes que usar la clase para desambiguar su uso.

Si la constante se ha definido para la implementacion de la clase, entonces no tiene ningun sentido ponerla fuera de la misma y la manera correcta de hacerlo, entonces, es moviendo la inicializacion hacia la seccion entre la firma del constructor y las llaves del mismo, como lo mencione previamente.
  #8 (permalink)  
Antiguo 22/03/2010, 15:04
 
Fecha de Ingreso: diciembre-2007
Ubicación: Valencia
Mensajes: 92
Antigüedad: 16 años, 4 meses
Puntos: 3
Respuesta: error en codigo

Cierto he interesante , porque realmente nunca me he visto en ese problema , y es una cuestión que no havia tenido encuenta ( llevo 4 meses con c++ sorry).
Pero como exactamente no se el uso exacto que le estas dando a la constante no he podido prever que querias que fuese algo oculto , privado al exterior.

Ahora creo que el problema es el posicionamiento de la contante.
  #9 (permalink)  
Antiguo 22/03/2010, 15:06
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: error en codigo

Cita:
Iniciado por rimobio Ver Mensaje
Ahora creo que el problema es el posicionamiento de la contante.
No entiendo a lo que te refieres con posicionamiento de la constante o a que problema te refieres.
  #10 (permalink)  
Antiguo 22/03/2010, 15:30
 
Fecha de Ingreso: diciembre-2007
Ubicación: Valencia
Mensajes: 92
Antigüedad: 16 años, 4 meses
Puntos: 3
Respuesta: error en codigo

Ya esta, Claro ¡¡

"Cannot initialize a class member here"

Veamos, la idea esta en que en una Clase no podemos inicializar nada ya que cuando creamos una clase no tenemos memoria reservada para guardar valores.

Pero claro , tambien es cierto que debe haber alguna forma para crear una contante privada.

Pero lo que si que esta claro es que ya sea dentro de la clase como dentro del contructor se crea un ERROR ya que no podemos cambiar el valor de la contante.


Interesante , mañana preguntare este asunto en clase.
Gracias¡¡
  #11 (permalink)  
Antiguo 23/03/2010, 09:00
 
Fecha de Ingreso: diciembre-2007
Ubicación: Valencia
Mensajes: 92
Antigüedad: 16 años, 4 meses
Puntos: 3
Respuesta: error en codigo

Vale , ya he mirado alguna solución.


Esta claro que si nos declaramos una contante dentro de la clase no puede ser inicializada.
Ya que si es introducida directamente produce un error de compilación , referido a que no es posible inicializar nada en la clase , con el motivo que una clase no tiene memoria reservada para guardar ese valor.
La segunda opción valorada era darle el valor en el constructor, pero tambien se produce un error de compilación ya que no es posible modificar el valor de la constante.

Claro pero como ya dije debe existir algun metodo..
Así que despues de preguntarlo , la conclusión que he obtenido es la siguiente:

Crear una variable con el modificador static con esto obtendremos una copia que compartirán todos los objetos de la misma clase. Si consultamos el valor de ese dato desde cualquier objeto de esa clase obtendremos siempre el mismo resultado, y si lo modificamos, lo modificaremos para todos los objetos.
Obteniendo una constante igual para todos los objetos.

Espero haverte ayudado, gracias por la pregunta .. ¡¡ xDD
  #12 (permalink)  
Antiguo 23/03/2010, 09:54
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: error en codigo

Cita:
Iniciado por rimobio Ver Mensaje
Esta claro que si nos declaramos una contante dentro de la clase no puede ser inicializada.
No es cierto. Si puede ser inicializada.
Desconozco por qué insistes en decir que una constante no puede ser inicializada.
La forma de hacerlo es asi:

Código C++:
Ver original
  1. class C
  2. {
  3.     const int i;
  4.  
  5.     C() : i(10)     // <-- antes de las llaves,
  6.                     //     momento correcto para inicializar constantes
  7.     {
  8.     }
  9. };

Estas, claramente, confundiendo la inicializacion con la asignacion.
El codigo alternativo:

Código C++:
Ver original
  1. class C
  2. {
  3.     const int i;
  4.  
  5.     C()
  6.     {
  7.          i = 10;
  8.     }
  9. };

No es una inicializacion. Es una asignacion, y ya sabemos que no puedes asignar constantes, pues son .... constantes.

Pero el error de compilacion daria incluso si no hubiera un const ahi.
En C++ no se puede inicializar miembros al definirlos.

Si quitamos el const, e intentamos inicializar el miembro i, como se ve abajo

Código C++:
Ver original
  1. class C
  2. {
  3.     int i = 10;
  4.  
  5.     C()
  6.     {
  7.     }
  8. };

el compilador tiene la obligacion de reclamar, porque no esta permitido, en el lenguaje C o C++ inicializar miembros alli junto a la definicion. El hecho que, ademas, haya sido marcada como const, solo hace mas dificil la inicializacion, pero no tiene que ver con el fondo del asunto, es decir que los miembros no se pueden inicializar al definirlos y éste es el mensaje que aparecio al compilar y que es el origen de este thread.
  #13 (permalink)  
Antiguo 23/03/2010, 10:27
 
Fecha de Ingreso: diciembre-2007
Ubicación: Valencia
Mensajes: 92
Antigüedad: 16 años, 4 meses
Puntos: 3
Respuesta: error en codigo

Si , es meramente una confusión de terminos pero lo tengo claro.


Mi solucion

Código C++:
Ver original
  1. class C
  2. {
  3.      
  4. public:
  5. ...
  6. ...
  7. private;
  8.    static int i ;
  9. ...
  10. ...
  11.  
  12.   };

constructor

Código C++:
Ver original
  1. C::C()
  2. {
  3.   i = 10 ;
  4.  // si que puede ser asignado porque no es una constante,
  5. // y si es modificado todos los objetos tendran el mismo valor.
  6. }
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 16:18.