簡體   English   中英

C++ 中的 class 的構造函數中的不同 arguments

[英]Different arguments in the Constructor of a class in C++

如果參數的類型不同,我可以讓構造函數以不同的方式工作嗎? 即整數或浮點數。

假設我這樣做了,new Object(3) 構造函數在每個索引處用 3 填充數組

假設如果我這樣做了,new Object(3.5) 構造函數會為每個索引填充一個 index+3.5 的數組

假設如果我這樣做了,new Object() 構造函數會在每個索引處用 0.0 填充一個數組

有沒有辦法只用一個構造函數來實現這一點? 還是我需要三個不同的構造函數?

謝謝。

當然你可以有很多構造函數。 構造函數的重載與任何函數/成員的重載相同。

請記住,有時編譯器可以隱式調用您不希望被調用的構造函數——通過 arguments 的自動轉換。

您可以在構造函數聲明中添加關鍵字顯式以禁止任何自動轉換。

你可以用一個構造函數來做,但它會很丑陋。 提供了 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);
};

如果您只關心內置類型,則可以利用類型提升和默認值:

struct Object
{
    Object(double value = 0.0)
    {
        // do that thing you do
    }
};

只要傳遞的參數始終屬於同一類型,您就可以使用一個構造函數,否則您需要多個。

似乎最明顯的解決方案是在 object 構造函數中插入一個 switch 語句。

例子:

public Object(int num)
{
switch (num)
{
case 1: array[i]  = num;
break
case 2: array[i] = num * 2;
}

}

完全基於參數類型的構造函數具有如此不同的行為通常是一個壞主意,尤其是對於易於在彼此之間隱式轉換的內置類型。

話雖如此,純粹作為編程練習,可以使用一個構造函數來執行此操作,但您必須使用代理 class 隱式轉換要區分的類型才能實現您想要的。 作為預裝解決方案, boost::variant 將滿足要求。 您可能認為這不能滿足單個構造函數的要求,因為它依賴於第二個 class 的多個構造函數(或構造函數模板)。

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 個不同的構造函數。

需要多個構造函數,每個不同的參數類型一個。

您將需要三個不同的構造函數(重載它們)或一個具有一些具有默認值的屬性。

這是可以實現的,但是我建議使用 3 個不同的構造函數以使代碼清晰等。

不僅你需要三個不同的構造函數,你還需要三個不同的構造函數。 它將使代碼更簡潔,更易於理解、維護和單元測試。

您可以考慮行為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)
};

使用 3 個不同的構造函數,因為邏輯根據參數的類型而有所不同。 另外,請注意編譯器所做的類型提升。否則在執行代碼時您可能會遇到意外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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