2009-12-26 9 views
15

Estoy trabajando con algún código C++/CLI (sintaxis nueva) y estoy tratando de declarar un tipo genérico y quiero establecer una variable miembro en su valor predeterminado.¿Cuál es el C++/CLI equivalente a C# 's por defecto (T)?

En C#:

class Class<T> 
{ 
    T member = default(T); 
} 

¿Cuál es el equivalente en CLI?

generic<typename T> public ref class Class 
{ 
public: 
    Class() : member(default(T)) // <-- no worky 
    { 
    }  
private: 
     T member; 
}; 

Respuesta

11

Curiosamente, la sintaxis hace que se vea así: T(). Requiere la adición de un constructor de copia.

generic<typename T> 
    public ref class Class 
{ 
public: 
    Class() : member(T()) 
    { 
    } 

    Class(Class^ c) 
    { 
     member = c->member; 
    } 

private: 
    T member; 
}; 

Editar DOH Esto funciona también (estado en C# tierra durante tanto tiempo se me olvidó que NULL y 0 son la misma cosa en C++, por lo tanto, no hay necesidad de diferente valor y los valores por defecto de tipo de referencia) :

generic<typename T> 
    public ref class Class 
{ 
public: 
    Class() : member(0) 
    { 
    } 

    Class(Class^ c) 
    { 
     member = c->member; 
    } 

private: 
    T member; 
}; 
+2

Tiene razón acerca de T() y aproximadamente 0 es una constante de puntero nulo válida, pero 'member (0)' no siempre es correcto: requiere que T tenga un ctor que toma un int. –

+0

Clase c = gcnew Clase (); compila muy bien. ¿El tipo de plantilla requiere ese constructor (como Object no tiene uno) o es en este caso que el tipo de puntero del manejador administrado requiere ese constructor? – dkackman

+0

'nullptr' es el equivalente de C++/CLI de C# 'nulo'. '0' o 'NULL' no es un tipo de puntero administrado. –

1

¿Pero no es el miembro privado ya inicializado con el constructor predeterminado?

+0

¿Lo es? Es mi recuerdo de que C++ no inicializa las variables miembro. Cómo C++ con un tiempo de ejecución y un montón administrado inicializa la memoria No tengo ni idea. – dkackman

+2

En C++, las variables miembro se inicializan con su constructor predeterminado. Usted podría estar pensando que los enteros no se inicializan a cero, o algo así ... eso es cierto, por supuesto. Pero los tipos que tienen constructores llaman a sus constructores por defecto. –

+0

Punto justo, pero dado que mi parámetro tipo puede ser un tipo de valor o un tipo de referencia, no me deja forma de inicializarlo. La razón variable predeterminada (T) es parte de C#. Supongo que esperaba un equivalente de CLI. – dkackman

Cuestiones relacionadas