我正在开发一个C ++程序,它有一系列类变量,包含部分或全部成员变量的向量。我的问题有三个:
是否可以直接使用构造函数初始化属于类的矢量变量(请参阅下面的示例类定义)?有人可以为下面的类发布一个示例构造函数(或至少为单维和二维向量变量)吗?
在我的代码中自己简单地初始化变量是否存在问题(即,使用循环迭代遍历向量的每个元素以分配初始值)?
沿着相同的路线,如果变量需要在不同的上下文中初始化为不同的值(例如,在一个实例中为零,在另一个实例中为某个数字),是否有办法通过构造函数来处理它? / p>
示例类定义:
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 :(得分: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)
在C ++中,初始化变量会调用其构造函数。在向量的情况下,这意味着它创建了一个向量的实例,无论初始容量是多少(10我相信),没有值。此时,您需要使用push_back来填充向量 - 即使它具有容量,如果您尝试直接访问未填充区域(例如使用NumofModeled [0]),它将导致未定义的行为。您也可以使用向量NumofModeled(x)(x是空格数)使用一定量的空间对其进行初始化,但通常因为向量具有动态大小,所以除非有某些原因需要输入数据,否则更容易使用push_back无序。
与容量部分相关,如果您尝试访问向量中的未填充空间,则会得到未定义的行为。通过循环填充矢量是非常标准的做法,例如:
vector<int> v;
int in = 0;
while (cin)
{
cin >> in;
v.push_back(in);
}
是的,但请记住,就像函数一样,构造函数只能根据输入参数的类型进行区分。因此,例如,您可以拥有CreditBasedPoolLevel(int level)
和CreditBasedPoolLevel(vector<int> levels)
,但不能拥有定义CreditBasedPoolLevel(int otherint)
的另一个,因为它会与第一个冲突。如果您希望能够采用相同类型的不同上下文输入,则可以使用另一个变量来定义构造函数类型,例如CreditBasedPoolLevel(int input, string type)
,并使用开关块根据类型定义初始化逻辑。 / p>