Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 构造函数中的数据验证?_C++_Validation_Oop_Constructor - Fatal编程技术网

C++ 构造函数中的数据验证?

C++ 构造函数中的数据验证?,c++,validation,oop,constructor,C++,Validation,Oop,Constructor,我是OO编程的初学者,这个问题是关于在特定设计中处理数据验证的。我读过一个类似的问题,我喜欢第二个解决方案,它建议重新设计构造函数接口,使无效值不可能出现,但我想知道这个想法是否也适用于我的情况。因此,我在下面概述了我的想法,并想知道人们是否同意我的想法 我有一个Die类,它是通过传递一个概率向量来构造的。所有的概率必须是非负的,并且加起来必须为1.0 class Die { public: Die(/* Probability vector. */); int Roll();

我是OO编程的初学者,这个问题是关于在特定设计中处理数据验证的。我读过一个类似的问题,我喜欢第二个解决方案,它建议重新设计构造函数接口,使无效值不可能出现,但我想知道这个想法是否也适用于我的情况。因此,我在下面概述了我的想法,并想知道人们是否同意我的想法

我有一个
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内)。