0

我正在开发一个 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;

};
4

3 回答 3

1

至于第三个问题,只需添加一个带有参数的构造函数,该参数是您要初始化向量的值。

如果您只想默认构造向量,则无需执行任何操作。

于 2013-08-06T13:24:25.550 回答
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);
   }
}

请注意,这是一个解决方案,它实际上取决于您想要什么值,您如何组织它们等等,什么是您的案例的“正确”解决方案。

于 2013-08-06T13:59:58.937 回答
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)and CreditBasedPoolLevel(vector<int> levels),但不能有另一个定义CreditBasedPoolLevel(int otherint),因为它会与第一个冲突。如果希望能够接受相同类型的不同上下文输入,可以使用另一个变量来定义构造函数类型,例如CreditBasedPoolLevel(int input, string type)使用 switch 块来定义基于类型的初始化逻辑。

于 2013-08-06T14:21:24.620 回答