2013-10-08 66 views
2

在C++中,是有可能有一個構造函數以這樣的方式,說如果我有5個參數的對象:double P1double P2double P3double P4boolean P5,我可以有我的構造以這樣的方式工作是如果我說:基於最後一個參數值的構造函數?

MyObject (double param1, double param2, true),則參數1被分配到P1和參數2被分配到P2,P3和P4被分配到0和P5被分配到真正

如果我做的:

MyObject (double param1, double param2, false) ,那麼參數1被分配給P3,而參數2被分配給P4,P1和P2分配爲0,P5分配爲假?

即,使用的構造函數是基於傳入的最後一個參數的值?

+1

重載必須至少有一個參數類型不同,你的例子中不是這種情況。 – ChiefTwoPencils

+0

這就是爲什麼它比ususal更復雜@BobbyDigital :) – AZhu

回答

1

這是又一個選項。 - 當然認爲

MyObject(double param1, double param2, bool param3) { 
     P5 = param3; 
     if (P5) 
      defaultConstructor(param1, param2, 0.0, 0.0); 
     else 
      defaultConstructor(0.0, 0.0, param1, param2); 
    } 

    void defaultConstructor(double param1, double param2, double param3, double param4) { 
     P1 = param1; 
     P2 = param2; 
     P3 = param3; 
     P4 = param4; 
    } 
}; 

這對我來說是直線前進,有點清潔:不要改變或提供兩個,因爲這不是你想要做的和的,而不是在你的構造擴展代碼試試這個什麼。 對不起,指出評論中的明顯;)

2

你可以有多個構造

C(double P1, double P2, double P3, double P4) 
: m_P1(P1), m_P2(P2), m_P3(0),m_P4(0), m_P5(0) { ; } 

C(double P1, double P2) 
: m_P3(P1), m_P4(P2) {;} 
... 

一般與功能,最好不要有一個布爾值來確定的行爲,因爲它使功能更難以閱讀,相反,它是更好的分裂功能兩個,以便功能彼此不同。

PrintAllHtml(bool b)說不到

PrintHtmlHead() PrintHtmlBody()

,並且可以更容易稍後修改。

+0

+1「通常與功能,最好不要有一個布爾來確定行爲」。如果我能的話會+2。 – Johnsyweb

1

是的,您可以擁有多個具有不同簽名的構造函數,以及一個基於傳遞的參數具有不同行爲的構造函數。雖然你可能不想太瘋狂,因爲如果構造函數行爲異常,使用你的類的人將會很難。

1

只要有一個if語句在你的構造

MyObject(double par1, double par2, bool par3) 
{ 
    this->p5 = par3; 
    if(par3) 
    { 
     this->p1 = par1; 
     this->p2 = par2 
     this->p3 = 0; 
     this->p4 = 0; 
    } 
    else 
    { 
     this->p1 = 0; 
     this->p2 = 0; 
     this->p3 = par1; 
     this->p4 = par2; 
    } 
} 
1

如果truefalse總是常數(即,你總是會通過其中truefalse一些布爾變量)那麼你可以使用模板和專業化來做到這一點。坦率地說,我很難提供建議。

在我看來,最straightfoward方式做工作纔剛剛使用if聲明在構造函數:

MyObject(double P1, double P2, bool b) { 
    if (b) { 
     P1_ = P1; 
     P2_ = P2; 
     P3_ = P4_ = 0.0; 
     P5 = true; 
    } 
    else { 
     P3_ = P1; 
     P4_ = P2; 
     P1_ = P2_ = 0.0; 
     P5 = false; 
    } 
} 

隨口說說的,但是,我想我會退後一步,想象的更難什麼你」重新做。將布爾作爲參數傳遞通常是一個糟糕的主意,因爲它在傳達意義方面做得很差 - 即使在充其量下,MyObject(1, 2, true);MyObject(2, 3, false);的含義並不明顯。就你而言,它看起來比平常更有意義,因爲你需要閱讀ctor才能得知任何一方的作用。

摘要:是的,這是可能的 - 但我真的懷疑這是一個好主意。