踩坑记录 | C++ | struct初始化

这是一个非常悲伤的故事

众所周知,结构体struct的初始化有以下几种方式:

struct A {
    int x;
    int y;
}
//1
struct A a={1, 2};
//2
struct A b;
b.x = 1; b.y = 1;
//3.置空
struct A c;
memset(&c, 0, sizeof(c));

但是我在编程中出现了这样的一个问题:

定义了这样的 struct Pointstruct Line,分别表示平面坐标系上的点和经过某两点的直线,并编写了相关的一系列运算函数。

struct Point {
	double x;
	double y;
	double length;
    
	//重写运算符的代码在此省略
};

struct Line {
	Point p1, p2;
};

在VS中进行单元测试时测试了相关的几个运算函数,在此随意写出几个,如下所示。在直接运行源程序时测试调试这些输入样例都显示正确,但是在单元测试时却一直报错,计算出的点testPoint 的横纵坐标甚至为Nan.

经过反复尝试,发现是用这种方式初始化结构体导致的,当改变了初始化方式后就能通过单元测试。

//修改前
TEST_METHOD(T1)
{
	struct Line line1{1, 0, 1, 1};
    //Line line1 = Line{1, 0, 1, 1}; 也会报错
    struct Point point{0, 0};
	
	struct Point testpoint = getProjection(point, line1);
	struct Point realpoint = { 1, 0 };
	Assert::IsTrue(testpoint == realpoint);
}

//修改后
TEST_METHOD(T1)
{
	Line line1;
	line1.p1.x = 1; line1.p1.y = 0; line1.p2.x = 1; line1.p2.y = 1;
	Point point;
	point.x = 0; point.y = 0;
	Point testpoint = getProjection(point, line1);
	Point realpoint = { 1, 0 };
	Assert::IsTrue(testpoint == realpoint);
}

目前具体错误原因还不明,如果有类似错误的可以尝试这样修改。

posted @ 2020-03-22 11:12  杞棠  阅读(771)  评论(0编辑  收藏  举报