[C con Clase] Problema: Errores en el Compilador

Steven Davidson steven en conclase.net
Mie Dic 27 11:47:12 CET 2006


Hola David,

El pasado 2006-12-26 19:40:01, David Reza escribió:

DR> 

Antes de continuar, quiero agregar lo que ya se ha mencionado por varios socios en esta discusión. Partimos de la idea básica que estamos hablando de "C++ Administrada o Gestionada", en corto, MC++. Por lo tanto, quiero dejar bien claro que MC++ no es C++. Microsoft inventó una serie de extensiones a C++ resultando en MC++. Esto implica que los compiladores de C++ no tienen por qué entender MC++. Por lo que sé, sólo los productos de Microsoft pueden tratar código escrito en MC++; o sea, Visual Studio .NET. MC++ al igual que C# sólo sirven para crear programas basadas en el armazón (framework) .NET, el cual es otro invento de Microsoft.

Creo que ya puedes contestar a tus mismas preguntas con lo que acabo de explicar, pero lo haré explícitamente para el beneficio de todos.

DR> Quisiera saber si alguien me podría decir cómo puedo utilizar las funciones
DR> Console::Write, Console::Writeline, que supongo que son de alguna librería
DR> así como cout es de la librería de <iostream>.

No lo puedes hacer, porque Dev-C++ no entiende MC++ ni tampoco tiene una implementación de .NET, al menos que alguien lo haya hecho.

DR> Y también preguntar por mis otras dudas ya expuestas:
DR> ¿Cómo hago una clase administrada? En Visual Studio es con _gc antes del
DR> nombre de la clase, en todos los compiladores es igual?

Dicho lo anterior, sólo VC.NET entiende el modificador '__gc' y por tanto no forma parte del estándar de C++.

DR> ¿La clase administrada me sirve para que los objetos se eliminen solos
DR> cuando ya no se necesiten? También sé que se crean en el CLR (Common
DR> Language Runtime) en vez de crearse en la pila y por tanto se tienen que
DR> crear objetos primero definiendo un puntero para poder almacenar la
DR> dirección de memoria del objeto.

Exacto. '__gc' tiene que ver con el sistema automático de la "recogida de basura". Esto implica que el entorno se encarga de destruir aquellos objetos creados dinámicamente y por tanto, nuestro código no los destruye de forma explícita. Visto de otro modo, en C++, usamos 'new' y 'delete' para crear y liberar memoria para nuestros objetos y variables, mientras que en MC++, usamos 'gcnew' para crear memoria pero "gcdelete" es implícito y llevado acabo por el entorno de .NET.

DR> ¿Cómo creo una clase no administrada? ¿Con _value antes del nombre de la
DR> clase? ¿Es igual para todos los compiladores?

Puedes usar '__nogc' para declarar algo que sea "C++ nativo". El modificador '__value' sirve para establecer que las variables a crear contendrán los valores. Bajo MC++, las variables de tipo "gc" no contienen la información directamente sino a través de un puntero mediante el montículo (heap) del entorno.

DR> ¿Un puntero puede almacenar otro puntero? ¿En las clases administradas se

Sí, un puntero puede apuntar a otro puntero o dirección de memoria.

DR> supone que al crear un objeto se crea en tiempo de ejecución y en realidad
DR> devuelve un puntero que almacenamos en otro puntero?

Bueno, quiero recalcar el término "puntero", ya que a veces lo usamos para decir "una variable de tipo puntero" y otras veces como sinónimo de "dirección de memoria". En tu pregunta, mezclas ambos usos de la palabra "puntero". Es cierto que declaramos una variable de tipo puntero el cual servirá para guardar la dirección de memoria dada al crear memoria dinámicamente para el objeto administrado o gestionado.


Nuevamente quiero aclarar que todo esto es propio de Microsoft y Visual C++ .NET. Si estás aprendiendo C++, no uses el libro que tienes, ya que no conocerás C++, sino MC++ el cual es un invento de Microsoft para programar usando .NET. Usar MC++ es una limitación bastante grande, al menos que no te interese nada más que .NET.


Espero haber aclarado las dudas.

Steven


Más información sobre la lista de distribución Cconclase