2010-03-23 19 views
6

Quiero crear una clase de C++ con el siguiente tipo:C++ Variable declarable en el cuerpo de la función, pero no miembro de la clase?

  1. Puede ser declaradas dentro de una función.
  2. Se puede declarar dentro de una función de miembro.
  3. No se puede declarar como miembro de la clase.

El uso de esto: pensar en objetos "Root" para un GC.

¿Esto es posible en C++? En particular, estoy usando g ++. Dispuesto a cambiar a clang. O plantillas o macro solución bien.

Gracias!

Respuesta

16

Usted podría hacerlo con una macro, tal vez:

#define MY_TYPE \ 
    do { } while(0); \ 
    RealType 

void foo() { 
    MY_TYPE myvar; 
    myvar.Whatever(); 
} 

Esto sería solamente compilar dentro de una función (a causa de la "do ... while" poco - aunque se obtendría un error muy raro mensaje). Parece que uno de esos usos "malvados" de las macros que querría evitar, sin embargo ...

+5

Bastante creativo. :) – GManNickG

+0

¿Qué sucede si intentas 'const MY_TYPE myvar'? – Will

+4

Siempre se puede hacer 'MY_TYPE const myvar';) –

0

Aunque tengo que amar la respuesta de codeka, no puedo dejar de imaginar cuál es el problema con una declaración como atributo de miembro.

Para algo así como una raíz de GC Probablemente usaría el patrón Monoid. Todas las instancias de la clase son, de hecho, proxies a Singleton (en esencia), es decir, todas comparten el mismo estado. De esta forma, no importa cuántos se instancian, todos apuntan al mismo recurso.

Si lo hace para evitar referencias cíclicas, me temo que no es suficiente.

struct A { boost::shared_ptr<B> mB; }; 

struct B { boost::shared_ptr<A> mA; }; 
+0

Imagine que está escribiendo un intérprete de esquema. Parte de la funcionalidad está escrita en C. Ahora, GC puede suceder en cualquier momento. Sin embargo, cuando se ejecuta GC, queremos asegurarnos de que las referencias a bojects de esquema en la pila _C_ se traten como objetos raíz. – anon

+0

Así que está implementando su GC como un tipo 'Marcar y Barrer' ¿no? Es habitual que este tipo use la pila como raíz ... pero no me gusta el 'freeze the world' que causa, aunque, por supuesto, se usa para trabajar en servidores que tienen que responder en menos de 200ms, estoy predispuesto ahí. –

Cuestiones relacionadas