【问题标题】:C++: defining maximum/minimum limits for a classC++:定义类的最大/最小限制
【发布时间】:2010-05-20 17:25:04
【问题描述】:

我创建了一个类,该类对可变粒度每日时间表中的时间段进行建模,例如,第一个时间段是 30 分钟,但第二个时间段可以是 40 分钟,第一个可用时间段从 (一个与) 1 相当的值。

我现在要做的是以某种方式定义该类采用的最大和最小允许值,为此我有两个实际问题:

1.- 以这种方式为自定义类定义绝对最小值和最大值是否有意义?或者更好的是,在给定类的定义关系运算符的情况下,一个值总是比较低于该类型的任何其他可能值就足够了,被定义为最小值? (同样适用于最大值)

2.- 假设前面的问题有一个以“是”(或“是但...”)为模型的答案,如何定义这样的最大/最小值?我知道有std::numeric_limits<>,但从我读到的内容来看,它是用于“数字类型”的。我是否将其解释为“表示为数字”的意思,还是可以做出更广泛的假设,例如“用数字表示”或“与整数有对应关系”?毕竟,为日期类和字典类定义最小值和最大值是有意义的,但numeric_limits 可能不适合这些用途(我没有太多经验)。另外,numeric_limits 有很多额外的成员和信息,我不知道该怎么做。如果我使用numeric_limits,C++ 还提供了哪些其他众所周知/广泛使用的机制来指示类的可用值范围?

【问题讨论】:

    标签: c++ constants limits


    【解决方案1】:

    无法理解您的问题。我认为您要问的是,对班级的领域(可以提供给它并有意义的数据)保持自信是否有意义,如果是,那么如何自信。

    第一个有一个非常明确的答案:是的,绝对的。您希望您的课程是“......易于正确使用且难以错误使用”。这包括确保班级的客户在他们做错事时被告知。

    第二个答案不太清楚。很多时候,您只是想使用 assert() 函数来断言函数或类的域。其他时候你会想抛出一个异常。有时你想两者都做。当性能可能成为问题时,有时您希望提供一个两者都没有的接口。通常您希望提供一个至少可以检查的接口,以便客户端可以在尝试将其提供给您的类或函数之前判断什么是有效/无效输入。

    您可能同时希望断言和抛出的原因是因为抛出异常会破坏堆栈信息并可能使调试变得困难,但断言仅在构建期间发生,实际上并没有做任何事情来保护您免于运行计算或执行以下操作可能导致崩溃或使数据无效。因此,断言然后抛出通常是最好的答案,这样您可以在测试时遇到它时进行调试,但当这些错误出现时仍然可以保护用户。

    对于您的课程,您可以考虑使用几种方法来提供最小值/最大值。一种是在类的接口中提供最小/最大功能。另一个可能是使用外部功能,是的,numeric_limits 可能只是问题,因为范围有时是一种数字量。您甚至可以在您的类中提供一个更通用的接口,该接口具有 validate_input() 函数,以便您可以进行任何可能合适的比较。

    您问题的第二部分有很多有效答案,具体取决于包括个人品味在内的许多变量。

    【讨论】:

    • 感谢您的回答,诺亚。是的,我有时觉得我太冗长了,但你似乎对此没有任何问题,并且正好去了我想去的地方。是的,我想“对我班级的领域保持自信”。我在使用断言或 try/catch 来确保我不会搞砸代码方面没有太多麻烦,我只想要两件事:能够向我的客户提供相同(或相似)的信息,以便他们也可以做出相应的决定,并且可以以自然的方式提供信息。感谢您提供通用验证接口的提示。
    【解决方案2】:

    作为您的日程安排/时段代码的设计者,您需要多少灵活性/实用性取决于您。

    两种简单的方法是在该类中定义您自己的值

    const long MIN_SLOT = 1;
    const long MAX_SLOT = 999; // for example
    

    或者定义另一个包含定义的类

    class SchedLimits{
    
    public:
    const static long MIN_SLOT = 1;
    const static long MAX_SLOT = 999;
    }
    

    最简单的就是枚举。 (感谢让我想起这些的评论者)

    enum {MIN_SLOT = 1, MAX_SLOT = 999};
    

    【讨论】:

    • 最简单的方法几乎总是最好的。
    • ...更好的是,使用枚举:enum {MIN_SLOT = 1, MAX_SLOT = 999};,您可以在编译时使用它们。
    • 枚举也是一个好主意。我将编辑我的答案以反映这一点。
    • 感谢您的评论。我会采用带有约束的类的想法,但我正在寻找“ints do it that way too”意义上的更“自然”的东西。然而,正如 Crashworks 所提到的,最简单的方法可能是最好的,我可能只是一无所获。再次感谢。
    • 您也可以在编译时使用静态 const 积分字段。
    【解决方案3】:

    只需创建一些反映最小值和最大值的 const 静态成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多