C ++类变量:向量的初始化与赋值和初始化

时间:2013-08-06 13:21:32

标签: c++ class initialization

我正在开发一个C ++程序,它有一系列类变量,包含部分或全部成员变量的向量。我的问题有三个:

  1. 是否可以直接使用构造函数初始化属于类的矢量变量(请参阅下面的示例类定义)?有人可以为下面的类发布一个示例构造函数(或至少为单维和二维向量变量)吗?

  2. 在我的代码中自己简单地初始化变量是否存在问题(即,使用循环迭代遍历向量的每个元素以分配初始值)?

  3. 沿着相同的路线,如果变量需要在不同的上下文中初始化为不同的值(例如,在一个实例中为零,在另一个实例中为某个数字),是否有办法通过构造函数来处理它? / p>

  4. 示例类定义:

    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;
    
    };
    

3 个答案:

答案 0 :(得分:1)

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

如果你只想让向量默认构造,那么就没有什么需要做的了。

答案 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);
   }
}

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

答案 2 :(得分: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),并使用开关块根据类型定义初始化逻辑。 / p>