簡體   English   中英

具有int和char *的C ++重載構造函數

[英]c++ overload constructor with int and char*

我嘗試用intchar *重載構造函數。 然后調用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 longunsigned 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM