如果參數的類型不同,我可以使用不同的方式創建一個構造函數嗎?即int或float。C++中一個類的構造函數中的不同參數
比方說,如果我這樣做,新的對象(3) 構造各項指標在填滿了3數組
比方說,如果我這樣做,新的對象(3.5) 構造填充使用數組對於每一個指標
指數+ 3.5比方說,如果我這樣做,新的對象() 構造各項指標
有沒有辦法只有一個構造函數來實現這個填充在用0.0陣列?或者我需要三種不同的構造函數?
謝謝。
如果參數的類型不同,我可以使用不同的方式創建一個構造函數嗎?即int或float。C++中一個類的構造函數中的不同參數
比方說,如果我這樣做,新的對象(3) 構造各項指標在填滿了3數組
比方說,如果我這樣做,新的對象(3.5) 構造填充使用數組對於每一個指標
指數+ 3.5比方說,如果我這樣做,新的對象() 構造各項指標
有沒有辦法只有一個構造函數來實現這個填充在用0.0陣列?或者我需要三種不同的構造函數?
謝謝。
您需要3個不同的構造函數。
需要多個構造函數,每個不同的參數類型一個。
您將需要三個不同的構造函數(重載它們)或一個具有一些具有默認值的屬性。
這可以實現,但是我會建議使用3個不同的構造函數代碼清晰度等
如果你只關心內建類型,你可以採取型促銷活動和默認值的優勢:
struct Object
{
Object(double value = 0.0)
{
// do that thing you do
}
};
你可以用一個構造函數來完成,但它會像地獄一樣醜陋。 提供了3種構造函數方法,因爲它分離了用法並簡化了代碼。
當然你可以有許多構造函數!重載構造函數的工作方式與任何函數/成員相同。
請記住,有時編譯器可以隱式地調用一個你不想被調用的構造函數 - 通過自動轉換參數。
您可以將關鍵字explicit添加到構造函數聲明中禁止任何自動轉換。
不但你需要三個不同的構造函數,你需要三個不同的構造函數。它將保持代碼更清晰,更易於理解,維護和單元測試。
只要傳遞的參數總是相同的類型,您可以使用一個構造函數逃脫,否則您需要幾個。
看起來好像最明顯的解決方案是在對象構造函數中插入switch語句。
例子:
public Object(int num)
{
switch (num)
{
case 1: array[i] = num;
break
case 2: array[i] = num * 2;
}
}
,因爲他們做同樣的事情你可以因素的行爲Object()
和Object(3)
。只要寫你的構造是這樣的:
class Object {
// fills an array with n at every index
Object(int n = 0) { ... }
};
的問題是,用一個浮點數(3.5中的例子)具有構造要分開,就像這樣:
class Object {
// fills an array with n at every index
Object(int n = 0) { ... } // handles Object() AND Object(3)
// fills an array with index + n at every index
Object(float n) { ... } // handles Object(3.5)
};
它通常是對於一個純粹基於參數類型的構造函數具有這種不同行爲的壞主意,尤其是對於可以在對方之間隱式轉換的內置類型。儘管如此,純粹作爲一種編程練習,可以使用一個構造函數來完成此操作,但是您必須使用一個代理類,並通過類型之間的隱式轉換進行區分以實現您想要的功能。作爲預罐裝解決方案,boost :: variant將符合要求。您可能不認爲這符合單個構造函數的要求,因爲它依賴於第二個類的多個構造函數(或構造函數模板)。
class Object
{
public:
Object(const boost::variant< int, double >& val = 0)
{
switch(val.which())
{
case 0:
// TODO: Fill array with val
break;
case 1:
// TODO: fill array with val + index
break;
}
}
// TODO: Add array member
};
使用3種不同的構造函數,因爲邏輯的不同取決於參數的類型。此外,請注意編譯器完成的類型升級。另外,當代碼執行時,您可能會得到驚喜。
這聽起來像是你的維修噩夢。我建議你使用命名的構造函數成語來代替:
class Object
{
public:
// Sets all elements to 0.
Object();
// Sets all elements to value.
static Object Fill(double value);
// Sets all elements to the previous + delta, beginning at start.
static Object Accumulate(double start, double delta);
};
對,但是如何根據傳入的內容完成3種不同的操作?他們都會上升一倍,所以你不知道該做哪一個。 – 2009-02-24 08:00:27
您可以將默認值設置爲默認值,然後檢查三個值中的哪一個(三個示例)已傳遞給構造函數。正如我在答覆中所說的那樣,你可以做到這一點,但這會很難看,也不清楚。 – 2009-02-24 08:04:19