• Miércoles 20 de Noviembre de 2024, 18:34

Autor Tema:  Punteros a una clase  (Leído 2315 veces)

recorcholis

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Punteros a una clase
« en: Sábado 10 de Enero de 2009, 02:07 »
0
Hola:
Estoy empezando C# y me ha surgido un problema a la hora de poner como miembro de una clase a un puntero de otra clase.

El caso es que en un archivo "Archivo1.cs" tengo definida la clase "Clase1" del siguiente modo

namespace Proyecto
{
    class Clase1
    {
        ...
    }
}

Y en un segundo archivo "Archivo2.cs" tengo definida la segunda clase "Clase2", la cual tiene como miembro a un puntero de Clase1

namespace Proyecto.Subproyecto
{
    class Clase2
    {
        Clase1*   m_pClase1;
    }
}

Al intentar compilar esto me he encontrado con el siguiente mensaje de error:
"Pointers and fixed size buffers may only be used in an unsafe context"

Tras investigar un rato he visto que los punteros en C# son peligrosos y que debemos marcarlos como unsafe.
Así que he cambiado el código tal que así:

namespace Proyecto.Subproyecto
{
    class Clase2
    {
        unsafe Clase1*   m_pClase1;
    }
}
(También he probado con el unsafe en otras posiciones)
Pero me seguía sin compilar, pero ahora me aparecía otro mensaje de error
"Cannot take the addres of, get the size of, or declare a pointer to a manage type"

He estado revisando documentación y me he encontrado con que este error solo pasa con las clases propias, por ejemplo, si cambio
unsafe Clase1*   m_pClase1;
por
unsafe int*   m_pClase1;
me compila correctamente.
Lo que me lleva a preguntarme si sera que no estoy "incluyendo" lo que debería y simplemente no encuentra Clase1.
Viendo esto he intentado hacer
unsafe Proyecto.Clase1* m_pClase1;
pero tampoco me funciona.
 :ouch:

Puede que este demasiado acostumbrado a C++ y en C# hay una alternativa mejor a los punteros.
Alguien me puede decir cual cree que es el problema y tiene alguna idea/alternativa para resolverlo?
Como estoy seguro de que estoy "incluyendo" un archivo?

Muchas gracias!

psikotic

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Punteros a una clase
« Respuesta #1 en: Sábado 10 de Enero de 2009, 04:21 »
0
usalo como si declararas una referencia:

Código: Text
  1. //en C++ es algo como:
  2.  
  3. Class1* p_class1 = new Class1();
  4. Class1& m_class1 = *p_class1;
  5. delete p_class1;
  6.  
  7. //en C# seria:
  8.  
  9. Class1 m_class1 = new Class1();
  10.  

obtienes una referencia al objeto, no es necesario que liberes los recursos .NET liberara los recursos automaticamente, esa es la razon por la cual no puedes crear un puntero de un "tipo Manejado" como lo indica el compilador, despues de un garbage collect se liberan los recursos que ya no se necesitan, se compacta el HEAP y las direcciones de las referencias son actualizadas si utilizas un puntero "nativo" la direccion a la que apunta no cambia y tu puntero ya no es valido. Puedes usar los punteros con tipos basicos, enum y struct ya que son Value Type y son almacenados en el StACK

recorcholis

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Punteros a una clase
« Respuesta #2 en: Sábado 10 de Enero de 2009, 13:29 »
0
Muchisimas gracias psikotic!!!
Funciona perfectamente.