C++ 构造函数中的数据验证?
我是OO编程的初学者,这个问题是关于在特定设计中处理数据验证的。我读过一个类似的问题,我喜欢第二个解决方案,它建议重新设计构造函数接口,使无效值不可能出现,但我想知道这个想法是否也适用于我的情况。因此,我在下面概述了我的想法,并想知道人们是否同意我的想法 我有一个C++ 构造函数中的数据验证?,c++,validation,oop,constructor,C++,Validation,Oop,Constructor,我是OO编程的初学者,这个问题是关于在特定设计中处理数据验证的。我读过一个类似的问题,我喜欢第二个解决方案,它建议重新设计构造函数接口,使无效值不可能出现,但我想知道这个想法是否也适用于我的情况。因此,我在下面概述了我的想法,并想知道人们是否同意我的想法 我有一个Die类,它是通过传递一个概率向量来构造的。所有的概率必须是非负的,并且加起来必须为1.0 class Die { public: Die(/* Probability vector. */); int Roll();
Die
类,它是通过传递一个概率向量来构造的。所有的概率必须是非负的,并且加起来必须为1.0
class Die
{
public:
Die(/* Probability vector. */);
int Roll();
}
我可以想到几个实现数据验证的选项:
Die
构造函数受保护并接受std::vector
。然后使用静态公共方法执行数据验证,如果成功,则返回指向新Die
对象的指针,否则返回NULL
ProbabilityVector
类,该类围绕一个std::vector
,并在那里实现数据验证(使用上面的受保护构造函数+公共静态方法)。然后Die
构造函数接受(指向a的指针)ProbabilityVector
probabilityvectorvalization
类,在std::vector
上使用静态方法返回bool
。然后,必要时,在将std::vector
传递给Die
构造函数之前使用此方法(1)的缺点是每次创建
模具时都会执行验证,即使这可能不是必需的。(2) 绕过这个问题,但我不确定受保护构造函数+静态公共方法是否优雅,因为它涉及原始指针。(3) 看起来是一个很有吸引力的选择,但似乎不如(1)和(2)?根据您的描述,很难判断哪一个更好。我建议你选择一个并实现它,然后在实现itI的同时完善你的设计我会继续说我总是使用1,这是最简单的(KISS)。我看到的最大问题是你试图把一堆双打加起来等于1(protip,他们(几乎)永远不会)。@MadScienceDreams Nice protip。实际上,确保它们的总和在0.99和1.01之间就足够了。然后我可以规范化它们。(为什么2需要原始指针?因为3不是必需的,我不认为这与在参数“总和必须是~=1.0”)中添加注释有什么不同@mga Um…如果我有一组N个双精度,如果sigma(S)=1.01,sigma(S/1.01)仍然不会总是等于1(尽管它在epsilon内)。