【问题标题】:Throw error on max instantiations of class在类的最大实例化上抛出错误
【发布时间】:2021-03-14 20:21:24
【问题描述】:

我希望我的程序在达到某个类的定义的最大对象数 (MAX) 时抛出错误。我必须限制实例化的数量,因为我正在使用一个提供有限资源的框架。

目前我有以下(简化):

class Resource {
    private:
    static int count;

    public:
    Resource();
};

int Resource::count = 0;

Resource::Resource() {
    if (++count > MAX) {
        throw std::domain_error("Cannot create more resources.");
    }
}

推荐使用std::domain_error 还是应该使用其他类型?还是我应该根本不抛出错误并采用不同的方法?

【问题讨论】:

  • 域错误是数学问题恕我直言。我个人会使用std::runtime_error
  • 如果框架不能为您提供更多资源,它应该抛出。它是什么框架?班级的实际规模是多少?您的示例没有成员,因此我不会费心限制实例数量。或者这应该是一个基类?
  • @bloody 我并没有质疑最小示例的有用性。我要的是真实案例,因为sizeof 应该有所作为。我希望您可以在 sizeof 较小时创建更多实例
  • @largest_prime_is_463035818 该框架是freeglut,我正在为灯光创建类以便于使用。这确实应该是灯光的基类。因为 freeglut 可以创建的光源数量有限,所以我认为在我的代码中限制此类的实例化是个好主意。
  • 如果不使用资源计数器,创建更多灯光会发生什么?

标签: c++ class error-handling instance throw


【解决方案1】:

我将回答一般性问题,而不考虑申请的任何细节。

是否推荐使用 std::domain_error 或者我应该使用另一个 类型?或者我应该根本不抛出错误并遵循不同的 方法?

关于抛出哪个异常:std::domain_error 特别与函数的参数超出允许范围有关,因此不适合。正如@NathanOliver 建议的那样,std::runtime_error 将是一个不错的选择。或由此派生的自定义异常。

关于抛出异常或使用不同的方法:一个重要的问题是何时预计错误会发生以及谁可以处理它

异常通常用于在正常操作期间可能发生的错误,最好在运行时处理。

如果分配的资源量是在开发过程中确定的,而过多的资源分配表明存在错误,则可以选择断言:

Resource::Resource() {
    assert(++count <= MAX);
}

如果超出限制,这将使程序的调试构建崩溃(快速失败),这在开发、测试和调试过程中通常非常有用,但如果可以超过限制,显然不应该使用成品。 (由于断言通常在发布版本中被删除,它会被忽视并导致超出限制的任何问题或未定义行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 2014-04-12
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多