[英]c++ overload constructor with int and char*
我嘗試用int
和char *
重載構造函數。 然后調用0
會有歧義。 是否有任何解決方法/解決方案?
CBigInt (unsigned int);
CBigInt (const char *);
問題在0
線上:
CBigInt a;
// some more code
a *= 0;
謝謝回答。
使構造函數之一明確。 然后,僅當傳遞的類型完全匹配時才使用它。
CBigInt (unsigned int);
explicit CBigInt (const char *);
您可以使用“ explicit”關鍵字:
explicit CBigInt(const char *);
使用此方法,必須將參數顯式轉換為const char *,否則將執行CBigInt(unsigned)。
“顯式”方法可行,但將來可能無法直觀地支持開發人員。 對於此類情況,在我之前從事的項目中,我們使用了靜態工廠方法。 我們將擁有一個私有的默認構造函數,並在靜態工廠中顯式初始化成員。 就像是:
class CBigInt {
public:
...
static CBigInt fromUInt(unsigned int i) {
CBigInt result;
result.value=i;
return result;
}
static CBigInt fromCharPtr(const char* c) {
CBigInt result;
result.value=parse(c);
return result;
}
...
private:
CBigInt () {}
/*some internal type here*/ value;
};
這種方法不僅消除了編譯器的歧義,而且消除了以后將支持您的代碼的歧義。
在這種情況下,我還建議使用explicit
構造函數,因為我認為任意字符串(構造函數采用的字符串)不會為數字( CBigInt
類建模)建模。 這種情況是explicit
設計的。
但是,這不適用於使用直接初始化的情況
struct A {
CBigInt n;
A():n(0) { } // ambiguity again
};
通常,不應使用explicit
來解決內部歧義。 它僅應用於禁止從一種類型轉換為另一種類型,而不是在explicit
構造函數上偏愛另一種構造函數。 實際上,新的C ++ 0x統一初始化不會在副本初始化上下文中忽略explicit
構造函數:
CBigInt f() {
return { 0 }; // still ambiguous
}
CBigInt b = { 0 }; // still ambiguous
統一初始化的規則是:都考慮了兩個構造函數,但是,如果選擇了顯式構造函數,則初始化格式不正確。
文字0
是一個int
。 假設您希望能夠接受所有整數類型,則至少需要添加一個采用int
構造函數。 您不需要為小於int
整數類型添加重載,因為與其他整數轉換或指針相比,這些類型更喜歡int
。 假設您有一個int
重載,還需要為剩余的整數類型添加重載,如果可用並使用了重載,請重載long long
和unsigned long long
。 歧義將不再出現:
CBigInt (int);
CBigInt (unsigned int);
CBigInt (long);
CBigInt (unsigned long);
// CBigInt (long long);
// CBigInt (unsigned long long);
explicit CBigInt (const char *);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.