2013-08-06 195 views
0

我上有一系列包含的部分或全部成員變量的向量類變量的C++程序的工作分配和初始化。我的問題有三個方面:C++類變量:初始化向量與

  1. 它是直截了當使用構造函數初始化向量變量是一類的一部分(見下面的示例類定義)?有人可以發佈下面的類的示例構造函數嗎(或者至少是單維和二維矢量變量)?

  2. 是否與簡單地初始化在我的代碼中的變量自己(即,通過使用循環分配一個初始值的矢量的每個元素迭代)中的問題?

  3. 沿着同樣的路線,如果變量需要在不同的上下文中初始化爲不同的值(例如,在一個實例中爲零,在另一個實例中爲零),有沒有辦法通過構造函數來處理?

樣品類的定義:

class CreditBasedPoolLevel { 
public: 
    int NumofLoans; 
    int NumofPaths; 
    int NumofPeriods; 
    double TotalPoolBal; 

    vector<int> NumofModeled; 
    vector<double> ForbearanceAmt; 
    vector<double> TotalAmtModeled; 

    vector<vector<int>> DefCountPoolVector; 
    vector<vector<double>> TermDefBalPoolVector; 
    vector<vector<double>> BalloonDefBalPoolVector; 
    vector<vector<double>> TermDefBalPoolVectorCum; 
    vector<vector<double>> TermSeverityAmt; 
    vector<vector<double>> TermELAmtPoolVector; 
    vector<vector<double>> BalloonELAmtPoolVector; 
    vector<vector<double>> TermELAmtPoolVectorCum; 

}; 
+0

你問「如何用構造函數中的一些有用內容填充向量」? –

+0

只需調整大小,分配並推回構造函數中需要的內容。 –

+0

@MatsPetersson是... – brentf

回答

1
  1. 在C++中,初始化變量調用它的構造。在矢量的情況下,這意味着它創建一個矢量的實例,無論初始容量是多少(10我相信),沒有值。此時,您需要使用push_back來填充矢量 - 即使它具有容量,如果嘗試直接訪問未填充區域(例如使用NumofModeled [0]),則會導致未定義的行爲。您還可以使用向量NumofModeled(x)(x是空格數)以一定的空間初始化它,但通常因爲向量具有動態大小,所以使用push_back會更容易,除非有某些原因需要輸入數據沒有秩序。

  2. 涉及到一個能力的一部分,如果你試圖在一個載體,你會得到不確定的行爲來訪問未填充的空間。這是非常標準的做法,以填補向量與循環雖然,如:

    vector<int> v; 
    int in = 0; 
    while (cin) 
    { 
        cin >> in; 
        v.push_back(in); 
    } 
    
  3. 是的,但請記住,像函數,構造函數只能通過輸入參數的類型進行區分。因此,例如,你可以有CreditBasedPoolLevel(int level)CreditBasedPoolLevel(vector<int> levels),而不是另一個與定義CreditBasedPoolLevel(int otherint),因爲它會與第一次衝突。如果要能夠採取的相同類型的不同上下文輸入中,可以使用另一個變量來定義構造類型,如CreditBasedPoolLevel(int input, string type)和使用開關塊以定義基於類型的初始化邏輯。

+0

'at()'會拋出異常,'operator []'只會導致未定義的行爲。 –

+0

(我修正了你的代碼塊 - 編號和項目符號列表中的代碼塊需要更多的縮進,只是保持在前面的空間,直到預覽變成代碼塊) –

+0

啊,看起來Ben是正確的關於未定義的行爲。如果有人使用'operator []'填充矢量,大小是否會更新? – IllusiveBrian

1

至於問題之三,只需要添加一個構造器是您要使用初始化向量的值的參數。

如果你只是想在矢量是默認的構造,那麼就沒有什麼需要做的事情。

1

構造可能是這個樣子:

CreditBasedPoolLevel::CreditBasedPoolLevel() 
{ 
    const int numDefCountPools = 13; 
    const int numDefCountPoolEntries = 25; 

    for(int i = 0; i < numDefCountPools; i++) 
    { 
     vector<int> v; 
     for(int j = 0; j < numDefCountPoolEntries; j++) 
     { 
      v.push_back(j + i * 5); // Don't know what value you ACTUALLY want to fill here 
     } 
     DefCountPoolVector.push_back(v); 
    } 
} 

注意,這是一個解決方案,它實際上取決於你想要什麼樣的價值觀,你如何去他們組織等,什麼是「正確」的解決方案你的情況。