我知道有沒有辦法在pure C++做到這一點,但我想知道是否有可能調用在C++/CLI的另一個構造函數的初始化列表構造,在C#中也可以這樣做。如何重載構造函數調用轉發給下再構造++/CLI
實施例:
ref class Foo {
Foo() {}
Foo(int i) : Foo() {}
}
我知道有沒有辦法在pure C++做到這一點,但我想知道是否有可能調用在C++/CLI的另一個構造函數的初始化列表構造,在C#中也可以這樣做。如何重載構造函數調用轉發給下再構造++/CLI
實施例:
ref class Foo {
Foo() {}
Foo(int i) : Foo() {}
}
它被稱爲 「委託構造函數」。目前尚未在語言中提供。但是有一個正式的提案,你可以在language specification的附錄F.3.1中找到它。考慮到微軟對C++/CLI的立場,這一點不太可能在短期內看到。
更新:委託構造函數確實超出了該附件中的建議,它們被添加到標準C++ 11語言規範中。微軟一直致力於實現C++ 11的新增功能。委託構造函數最終爲VS2013做好了準備。他們也在該版本的C++/CLI中工作。
你可以做以下
ref class A
{
public:
A(int p) : p(p) { this->A::A(); }
A() : p(1) {}
int p;
};
這是不合法的C++代碼,但VC編譯它精細:)
當你說「我知道有沒有辦法做到這一點純粹的C++「你錯了。在原生C++中可以這樣做。您可以使用展示位置新操作員來執行此操作。
class A
{
public:
A(int p) : p(p)
{ new(this)A(); }
A() : p(1) {}
int p;
};
錯誤。 http://www.parashift.com/c++-faq-lite/init-methods.html – user634175 2012-08-28 12:52:16
這是錯誤的。 – Puppy 2013-05-27 15:39:33
只是偶然發現,對於同一個問題。在我的情況下,我使用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 */
}
它並不能解決所有'問題',也不能阻止所有重複代碼的情況,但是它有很長的路要走。
的C++ 0x將支持這一點,其實 – sellibitze 2010-09-22 07:17:23