2009-12-26 11 views
15

Sto lavorando con qualche codice C++/CLI (nuova sintassi) e sto cercando di dichiarare un tipo generico e voglio impostare una variabile membro al suo valore predefinito.Qual è il C++/CLI equivalente al valore predefinito di C# (T)?

In C#:

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

Qual è l'equivalente in CLI?

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

risposta

11

È interessante notare come la sintassi assomigli a questa: T(). Richiede l'aggiunta di un costruttore di copie.

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

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

private: 
    T member; 
}; 

Modifica DOH questo funziona anche (stato in C# terreno per così tanto tempo mi sono dimenticato che NULL e 0 sono la stessa cosa in C++, quindi senza necessità di diverso valore e valori di default tipo di riferimento) :

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

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

private: 
    T member; 
}; 
+2

Hai ragione riguardo a T() e circa 0 essendo una costante di puntatore nullo valida, ma 'member (0)' non ha sempre ragione: richiede che T abbia un ctor che prende un int. –

+0

Classe c = gcnew Classe (); compila bene. Il tipo di modello richiede che il costruttore (come Object non ne abbia uno) o sia in questo caso che il tipo di puntatore dell'handle gestito richiede quel costruttore? – dkackman

+0

'nullptr' è l'equivalente C++/CLI di C# 'null'. '0' o 'NULL' non è un tipo di puntatore gestito. –

1

Ma il membro privato non è già stato inizializzato con il costruttore predefinito?

+0

E '? È mio ricordo che C++ non inizializza le variabili membro. Come C++ con un runtime e un heap gestito inizializza la memoria non ne ho idea. – dkackman

+2

Nelle variabili membro C++ vengono inizializzate con il costruttore predefinito. Potresti pensare che gli inti non vengano inizializzati a zero, o qualcosa ... è vero, ovviamente. Ma i tipi con cui i costruttori chiamano i loro costruttori predefiniti. –

+0

Punto giusto, ma dato che il mio parametro di tipo potrebbe essere un tipo di valore o un tipo di riferimento, non è possibile inizializzarlo. Il vari reason default (T) fa parte di C#. Supponevo che mi aspettassi un equivalente CLI. – dkackman

Problemi correlati