c++ 在初始化列表中抛出异常?

wqnecbli  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(131)

下面的代码:
在游戏h中:

mtm::Dimensions dimensions;
std::vector<std::shared_ptr<Character>> board;

在Game. cpp中:

Game::Game(int height, int width) : dimensions(height, width), board(height * width, nullptr) 
{
    if (height <= 0 || width <= 0) {
        throw mtm::IllegalArgument();
    }
}

但是你可能注意到我抛出错误太晚了,如果height * width小于0,那么bad_alloc将被抛出而不是IllegalArgument,我该如何修复这个错误?
有没有办法在初始化列表中抛出异常?

3pvhb19x

3pvhb19x1#

如果您无法在mtm::Dimensions中执行检查,它确实应该在那里,您可以使用一个helper函数:

int throw_if_not_positive(int x) {
    if (x <= 0) throw mtm::IllegalArgument();
    return x;
}

Game::Game(int height, int width) : 
    dimensions(throw_if_not_positive(height),
               throw_if_not_positive(width)), 
    board(height * width, nullptr) 
{
}

或者使用unsigned,或者使用

struct positive_int {
     int value;
     positive_int(int x) : value(x) {
        if (x <= 0)  throw mtm::IllegalArgument();
     }
     operator int(){ return value; }
};

Game::Game(positive_int height, positive_int width) : 
    dimensions(height,width), 
    board(height * width, nullptr) 
{
}
deikduxw

deikduxw2#

您可以首先捕获在构造board时抛出的bad_alloc,然后抛出您自己的自定义异常:

Game::Game(int height, int width) try : dimensions(height, width), board(height * width, nullptr) 
{
    if (height <= 0 || width <= 0) {
        throw mtm::IllegalArgument();
    }
}
catch(...)  // or specifically bad_alloc
{
   throw mtm::IllegalArgument();  // or some other custom exception
}

下面是另一个(更好的)答案,这是基于你自己在评论中的建议:

Game::Game(int height, int width) : 
  dimensions(height, width), 
  board((height * width > 0 ? height * width : throw mtm::IllegalArgument()), 
        nullptr) 
{
  // ...
}

这是一个demo

2fjabf4q

2fjabf4q3#

插入一个辅助函数以验证heightwidth

size_t helper(int height, int width)
{
    if (height <= 0 || width <= 0) {
        throw mtm::IllegalArgument();
    }
    return height * width;
}

Game::Game(int height, int width) : 
    dimensions(height, width), 
    board(helper(height, width), nullptr) 
{
}

相关问题