2013-08-06 193 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); 
    } 
} 

注意,这是一个解决方案,它实际上取决于你想要什么样的价值观,你如何去他们组织等,什么是“正确”的解决方案你的情况。