我是一些家谱软件(用C++和Qt编写)的开发人员。直到我的一位客户给我邮寄了一份错误报告,我才发现问题。问题是,客户有两个孩子和自己的女儿,因此,由于错误,他无法使用我的软件。
这些错误是我对正在处理的族图的各种断言和不变量的结果(例如,在走完一个循环后,程序声明X不能既是Y的父亲又是Y的祖父)。
如何在不删除所有数据断言的情况下解决这些错误?
我是一些家谱软件(用C++和Qt编写)的开发人员。直到我的一位客户给我邮寄了一份错误报告,我才发现问题。问题是,客户有两个孩子和自己的女儿,因此,由于错误,他无法使用我的软件。
这些错误是我对正在处理的族图的各种断言和不变量的结果(例如,在走完一个循环后,程序声明X不能既是Y的父亲又是Y的祖父)。
如何在不删除所有数据断言的情况下解决这些错误?
当前回答
你应该把Atreides家族(现代的Dune,或古代的Oedipus Rex)作为一个测试案例。通过使用经过净化的数据作为测试用例,您不会发现错误。
其他回答
撇开潜在的法律影响不谈,你显然需要将家谱上的“节点”视为前任,而不是假设节点可以是唯一的人。
让树节点包含一个人以及继任者,然后可以在树的更深处创建另一个节点,该节点包含同一个人和不同的继任者。
我想,你有一些价值,可以唯一地识别一个人,你可以根据这个人进行检查。
这是一个棘手的问题。假设您希望将结构保持为树,我建议如下:
假设这样:A和自己的女儿有孩子。
A在节目中以A和B的身份加入节目。一旦扮演了父亲的角色,我们就称之为男朋友。
添加一个is_same_for_out()函数,该函数告诉程序的输出生成部分,所有内部指向B的链接在数据表示时都应该指向a。
这将为用户带来一些额外的工作,但我想IT将相对容易实现和维护。
在此基础上,您可以进行代码同步A和B,以避免不一致。
这种解决方案肯定不是完美的,但却是第一种方法。
我讨厌评论这种糟糕的情况,但最简单的方法是在你的图中创建一个虚拟顶点,作为回到乱伦父亲的代理。
放松你的断言。
而不是改变规则,这可能对99.9%的客户在输入数据时发现错误非常有帮助。
相反,将其从错误“无法添加关系”更改为警告“无论如何添加”。
最重要的是避免产生问题,所以我认为你应该使用直接关系来避免循环。
正如@markmywords所说,#包括“fritzl.h”。
最后,我不得不说重新检查您的数据结构。也许那边出了问题(也许双向链接列表解决了您的问题)。