使用初始化列表时检查传递给构造函数的参数 - C++
Check parameters passed to constructor when using initialization lists - C++
我有一个 class 包含向量作为数据成员。
调用构造函数时,我希望所述数据成员由复制构造函数初始化,而不是默认初始化(为空向量对象),因此我使用初始化列表。
#include <vector>
using namespace std;
struct MyStruct {
vector<double> V;
vector<double> A;
vector<double> B;
MyStruct (vector<double> vee, vector< vector <double> > mat);
};
MyStruct::MyStruct (vector<double> vee, vector< vector <double> > mat)
: V(vee),
A(mat[0]),
B(mat[1])
{
/* Rest of the constructor here*/
}
我的问题是:
与允许默认初始化和使用其他方法相比,这样做是否提高了效率?例如做
V.assign(vee)
有没有办法让构造函数在默认初始化或列表初始化发生之前返回检查和 errors/messages?
我希望 ctor 例如如果 vector<vector<double>>
> 2 的大小,则停止,原因很明显,否则上面会产生段错误,我希望在调用构造函数时自动执行此过程。
我想如果您想避免异常,您可以这样做。它使用三元运算符检查 vector
的大小,如果 mat
.
中不存在,则使用空 vector
进行初始化
#include <vector>
using namespace std;
struct MyStruct {
vector<double> V;
vector<double> A;
vector<double> B;
MyStruct (vector<double> vee, vector< vector <double> > mat);
};
MyStruct::MyStruct (vector<double> vee, vector< vector <double> > mat)
: V(vee),
A(mat.size() < 1 ? vector<double>():mat[0]),
B(mat.size() < 2 ? vector<double>():mat[1])
{
// If you then want to throw your own exception:
if(mat.size() < 2)
throw std::range_error("accessing mat");
// alternatively set a flag
if(mat.size() < 2)
this->good = false;
}
我有一个 class 包含向量作为数据成员。
调用构造函数时,我希望所述数据成员由复制构造函数初始化,而不是默认初始化(为空向量对象),因此我使用初始化列表。
#include <vector>
using namespace std;
struct MyStruct {
vector<double> V;
vector<double> A;
vector<double> B;
MyStruct (vector<double> vee, vector< vector <double> > mat);
};
MyStruct::MyStruct (vector<double> vee, vector< vector <double> > mat)
: V(vee),
A(mat[0]),
B(mat[1])
{
/* Rest of the constructor here*/
}
我的问题是:
与允许默认初始化和使用其他方法相比,这样做是否提高了效率?例如做
V.assign(vee)
有没有办法让构造函数在默认初始化或列表初始化发生之前返回检查和 errors/messages?
我希望 ctor 例如如果 vector<vector<double>>
> 2 的大小,则停止,原因很明显,否则上面会产生段错误,我希望在调用构造函数时自动执行此过程。
我想如果您想避免异常,您可以这样做。它使用三元运算符检查 vector
的大小,如果 mat
.
vector
进行初始化
#include <vector>
using namespace std;
struct MyStruct {
vector<double> V;
vector<double> A;
vector<double> B;
MyStruct (vector<double> vee, vector< vector <double> > mat);
};
MyStruct::MyStruct (vector<double> vee, vector< vector <double> > mat)
: V(vee),
A(mat.size() < 1 ? vector<double>():mat[0]),
B(mat.size() < 2 ? vector<double>():mat[1])
{
// If you then want to throw your own exception:
if(mat.size() < 2)
throw std::range_error("accessing mat");
// alternatively set a flag
if(mat.size() < 2)
this->good = false;
}