2009-12-26 58 views
15

我正在使用一些C++/CLI代碼(新的語法),並試圖聲明一個泛型類型,並且想要將其設置爲默認的成員變量。什麼是C++/CLI等同於C#的默認(T)?

在C#:

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

什麼是在CLI等價?

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

回答

11

有趣的是,語法看起來像這樣:T()。它需要添加一個拷貝構造函數。

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

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

private: 
    T member; 
}; 

編輯 DOH這個工程太(已在C#的土地這麼久我忘了NULL和0是在C同樣的事情++,因此沒有必要針對不同的價值和引用類型的默認值) :

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

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

private: 
    T member; 
}; 
+2

你說得對T()和大約0是一個有效的空指針常量,但「成員(0)」並不總是正確的:它需要T有一個ctor,它接受一個int。 – 2009-12-26 06:44:05

+0

c = gcnew類();編譯得很好。模板類型是否需要該構造函數(因爲Object沒有)或者在這種情況下,託管句柄指針類型是否需要該構造函數? – dkackman 2009-12-26 17:26:05

+0

'nullptr'是C++/CLI的C#'null'的等價物。 '0'或'NULL'不是一個託管指針類型。 – 2009-12-30 15:51:18

1

但是不是已經使用默認構造函數初始化的私有成員?

+0

是嗎?我記得C++沒有初始化成員變量。 C++如何用運行時和託管堆初始化內存我不知道。 – dkackman 2009-12-26 04:21:39

+2

在C++成員變量中使用它們的默認構造函數進行初始化。你可能會認爲整數不是初始化爲零,或者是什麼......這當然是事實。但是具有構造函數的類型會獲取其默認構造函數。 – 2009-12-26 04:38:18

+0

公平點,但鑑於我的類型參數可能是一個值類型或引用類型,它使我無法初始化它。不同的原因默認(T)是C#的一部分。我覺得我只是期待一個CLI的等價物。 – dkackman 2009-12-26 04:50:55

相關問題