使用初始化列表之前的C++数据验证
C++ Data validation before using initialization list
我正在实现一个Triangle类,它的属性是Point类的三个私有对象。到目前为止,我正在三角形构造函数中使用一个初始化器列表来初始化这三个点。问题是,在创建它的时候,我必须确定它是否是一个有效的三角形(检查两边的和是否大于第三个(。我如何验证这一点?注意:我可以把我的三角构造函数改成这样:
Triangle(x0, y0, x1, y1, x2, y2)
但如果它看起来像这样,我真的很想知道该怎么做:
Triangle(p1, p2, p3)
我的代码看起来像这个
class Point {
private:
double x;
double y;
public:
Point():x(0.0), y(0.0) {};
Point(double x0, double y0):x(x0), y(y0){};
double distance(Point p) {//distance between two points};
//getters
//setters
};
class Triangle {
private:
Point v1;
Point v2;
Point v3;
public:
Triangle(Point p1, Point p2, Point p3):
v1(p1.getX(), p1.getY()),
v2(p2.getX(), p2.getY()),
v3(p3.getX(), p3.getY()) {
//Edit
if v1.distance(v2) + v2.distance(v3) <= v1.distance(v3) {
//This is not a valid triangle, assign correct values to
//v1, v2 and v3
}
}
//Other methods.
};
通过构造检查并仅创建有效对象在c++中非常常见。甚至有一个关于它的核心准则;如果构造函数无法构造有效对象,则引发异常。
所以在你的情况下,你可以提供这样的东西:
bool is_valid_triangle(Point p1, Point p2, Point p3) {
... // Implementation
}
...
Triangle::Triangle(Point p1, Point p2, Point p3) :
v1{p1}, // requires copy constructor for Point which you should add
v2{p2}, v3{p3}
{
if (!is_valid_triangle(p1, p2, p3)) {
throw std::invalid_argument("Points provided are not a triangle");
}
... // Set up class
}
然后用户需要检查他们是否正在创建有效的三角形:
try {
Triangle t{p1, p2, p3};
... // operate with t
} catch(...) {
... // Warn the user
}
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 在运行时处理类型擦除的数据-如何不重新发明轮子