C/Visual C - __gc error

 
Vista:

__gc error

Publicado por Ruben (4 intervenciones) el 22/05/2005 21:18:30
Estoy haciendo una biblioteca de clases en c++ .net y tengo dos clases declaradas, A y B; de la siguiente forma:

public __gc class B;

public __gc class A:public baseA
{
private:
B *entrada;
B *salida;
};

public __gc class B:public baseB
{
private:
A **entrantes;
A **salientes;
};]

Y recibo el siguiente error:

error C3160: 'entrantes' : no se puede declarar un puntero __gc interior ni una referencia como miembro de 'espacio_nombres::B'

error C3160: 'salientes' : no se puede declarar un puntero __gc interior ni una referencia como miembro de 'espacio_nombres::B'

¿Como puedo solucionarlo? Necesito tener en B esos punteros a A...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:__gc error

Publicado por fernando.gomez (1603 intervenciones) el 23/05/2005 19:53:14
Mmm... al parecer no vas a poder tener esos punteros como quieres. No soy experto en C++ administrado, pero estuve buscando, y según la documentación oficial de Microsoft, punteros interiores administrador (__gc) no pueden apunter al interior de una clase administrada, debido a que son lentos y requieren manejo especial del colector de basura. Por ello, no puedes declarar punteros __gc interiores como miembros de una clase. Este es el ejemplo sobre ese error que provee MSDN:

#using <mscorlib.dll>

__gc struct A
{
// cannot create interior pointers inside a class
int __gc* pg; // C3160
int g; // OK
int __nogc *pg2; // OK
};

int main()
{
int __gc* pg2; // OK
}

Supongo que la solución aquí es que declares los miembros de B como __nogc.

Otra salida es que emplearas C++ normalito y descente, o bien, C#. Pero supongo que estas últimas no son opción para tí =D...

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:__gc error

Publicado por ruben (4 intervenciones) el 23/05/2005 21:29:47
mmm no puedo declararlos como __nogc ya que A es una clase __gc, entonces el puntero debe ser del mismo tipo.
He probado a declararlos asi: *punt [ ]

pero al reservar memoria:

punt = new A *[num];
for(int i=0; i<num; i++)
{
punt [i]= new A [n];
}

obtengo errores de compilacion...

sabes de que puede ser??
Entonces como se puede declarar un puntero que apunte a un numero varible de arrays con un numero variable de elementos????
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:__gc error

Publicado por fernando.gomez (1603 intervenciones) el 23/05/2005 22:06:01
Pues si estás empleando código administrado, ¿por qué no empleas -por ejemplo- System::Collection::ArrayList? Creo que sería una buena opción, ya que esta clase te permite crear arrays dinámicos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:__gc error

Publicado por Ruben (4 intervenciones) el 23/05/2005 22:53:50
Mi idea es luego importar la dll desde una aplicacion c#, y para eso se necesita codigo administrado no??? (no estoy muy seguro)

Pues queria mantener mi sintaxis para tocar lo menos posible mi biblioteca (la tengo desde hace tiempo pero está implementada en
win 32, c++ normal).

No sabes como evitar esos errores usando *punt[ ]??
Entonces no puedo hacer nada con dobles punteros?no hay alguna extension administrada, en lugar de __gc que permita esto???
Pense que iba a ser mucho mas sencillo portar mi aplicacion a c++ .net
:(

Muchas gracias por tu ayuda ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:__gc error

Publicado por fernando.gomez (1603 intervenciones) el 30/05/2005 16:12:03
Tras mucho vagar por la web, y tras mucho preguntar, descubrí este artículo:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmxspec/html/vcManagedExtensionsSpec_7_4.asp.

Ahí te explica la diferencia entre "whole" pointers -aquellos que podrían solucionar tu problema- e "interior" pointers -el problema que tienes-. Espero te sea de ayuda.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar