2010-03-01 80 views

回答

14

它被稱爲 「委託構造函數」。目前尚未在語言中提供。但是有一個正式的提案,你可以在language specification的附錄F.3.1中找到它。考慮到微軟對C++/CLI的立場,這一點不太可能在短期內看到。


更新:委託構造函數確實超出了該附件中的建議,它們被添加到標準C++ 11語言規範中。微軟一直致力於實現C++ 11的新增功能。委託構造函數最終爲VS2013做好了準備。他們也在該版本的C++/CLI中工作。

1

你可以做以下

ref class A 
{ 
public: 
    A(int p) : p(p) { this->A::A(); } 
    A() : p(1) {} 

    int p; 
}; 

這是不合法的C++代碼,但VC編譯它精細:)

-5

當你說「我知道有沒有辦法做到這一點純粹的C++「你錯了。在原生C++中可以這樣做。您可以使用展示位置新操作員來執行此操作。

class A 
{ 

public: 

    A(int p) : p(p) 
    { new(this)A(); } 

    A() : p(1) {}  

    int p; 
}; 
+1

錯誤。 http://www.parashift.com/c++-faq-lite/init-methods.html – user634175 2012-08-28 12:52:16

+0

這是錯誤的。 – Puppy 2013-05-27 15:39:33

0

只是偶然發現,對於同一個問題。在我的情況下,我使用VS2010。

顯然,VS2010將永遠不會得到更新,如果你需要用標準更好地遵守(這是我做的時候我可以)全面落實C++ 11,使用VS2015。但對於一些(遺留)項目,我仍然需要使用VS2010。

,在很多情況下工作(對我來說)的方法是在它的所有共享初始化代碼,使用專用的功能。例如:

class A 
{ 
private: 
    void Inidialise() { /* common initialisation here */ } 

public: 
    A()  { Initialise(); /* specific initialisation for A() here */ } 
    A(bool a) { Initialise(); /* specific initialisation for A(bool) here */ } 
    A(int b) { Initialise(); /* specific initialisation for A(int) here */ } 

    /* etcetera */ 

} 

它並不能解決所有'問題',也不能阻止所有重複代碼的情況,但是它有很長的路要走。