首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++在尝试框中创建对象,然后将它们存储在std::数组中

C++在尝试框中创建对象,然后将它们存储在std::数组中
EN

Stack Overflow用户
提问于 2017-04-14 12:01:54
回答 3查看 178关注 0票数 1

我有一个Player对象,它可以在构造函数中抛出一个异常,所以在我的主函数中,我在一个try块中创建了2个Player对象。我想将这两个Player存储在这样的std::array中:

代码语言:javascript
运行
复制
try
{
  Player p1(10, 10, ikazuchi);
  Player p2(70, 10, hibiki);
  std::array<Player, 2> players = {p1, p2};
}

问题是,我无法在try块之外使用数组,而且我听说将所有main代码都放在try块中通常是个坏主意。

我不能在try块之后声明我的std::array,因为p1p2已经不存在了。

我可以用std::vector来解决这个问题,但是我已经读到,当我知道在编译过程中数组的大小时,最好使用std::array

我可以创建一个默认的构造函数来创建我的对象,然后在try块中填充它们,但是在构造函数中创建所有的东西似乎更合适。

这方面的最佳做法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-14 12:09:00

您总是可以使用动态分配或类似boost::optional<std::array<Player, 2>>之类的方法来解决这样的问题,但真正的问题是:您应该这样做吗?也就是说,假设一个player对象无法构造并抛出异常。在此之后,您将如何处理players数组?这不是一个合法的状态,或者至少不是在你期望的状态,如果没有异常抛出。

try的作用域很大是没有问题的。它应该涵盖所有异常会阻止您进步的地方。如果您不喜欢物理上有大量的源代码,请将代码移到函数中。无论如何,这可能是个好主意:一个假设一切顺利的函数,另一个主要负责处理错误的函数。

如果当内部的对象处于无效状态(构造函数抛出)时,您有了继续使用players的有意义的方法,那么您可以首先创建具有该状态的对象(在try块之外)的数组,然后在try中分配它们。

问题是,您不希望提供不需要的默认构造函数,但我声称,要么player属于try,要么Player需要默认构造函数(或表示“未正确初始化”的等效方式)。

票数 2
EN

Stack Overflow用户

发布于 2017-04-14 12:06:06

你可以在下面这样做。

代码语言:javascript
运行
复制
int main() {
  std::array<int, 2> array;
  try {
    array[0]=1;
    array[1]=1;
  } catch (...) {
  }
  return 0;
}

使用Player而不是int

票数 2
EN

Stack Overflow用户

发布于 2017-04-14 12:14:05

如果您的玩家csn被复制/移动并被构造,只需创建数组并分配到其中。

代码语言:javascript
运行
复制
std::array<Player, 2> players;
try{
  players[0]=Player(10, 10, ikazuchi);
  players[1]=Player(70, 10, hibiki);
} catch ...

另外,你也可以:

代码语言:javascript
运行
复制
std::optional<std::array<Player, 2>> players;
try{
  Player p1(10, 10, ikazuchi);
  Player p2(70, 10, hibiki);
  players.emplace(std::array<Player, 2>{{std::move(p1),std::move(p2)}});
} catch ...

但您可能需要找到一个非C++17版本的可选,如boost可选。

另一种办法是:

代码语言:javascript
运行
复制
auto players = [&]()->std::array<Player, 2>{
  try {
    Player p1(10, 10, ikazuchi);
    Player p2(70, 10, hibiki);
    return {{std::move(p1),std::move(p2)}};
  } catch (some_error){
    throw some_other_error;
  }
}();

但因此需要通过数组或抛出退出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43411133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档