在这个例子中,魔术数字是否正常?

时间:2012-02-11 11:55:00

标签: c++

在关于数组中幻数的this问题中,paxdiablo说除-1,0和1之外的任何数字都是幻数。我知道这只是一个指导方针,但我想知道在指定多维数组的维度时是否需要定义哪个维度为x,y和z的常量。例如,这没关系:

typedef boost::multi_array<TileID, 3> TileArray3D;

TileArray3D::size_type GoRPG::MapData::GetWidth() {
    return mData.shape()[0]; 
}

或者这是首选:

TileArray3D::size_type GoRPG::MapData::GetWidth() {
    return mData.shape()[x_dimension]; 
}

先谢谢,等等。

编辑:长度存储在数组中的原因是因为我使用的是Boost :: multi_array,这就是它们的存储方式。为破碎的代码道歉!我可以稍后解决这个问题 - 目前我只是想了解这些神奇的数字,虽然它仍然有用,谢谢!

3 个答案:

答案 0 :(得分:2)

不,魔术数字是不明显的。 -101通常很明显,但并非总是如此。

在你的情况下,你的片段对我来说都不是很明显。为什么地图数据的宽度存储在数组中?

如果没有看到更多代码,我宁愿这样做:

auto GoRPG::MapData::GetWidth() {
    return mData.shape()[width_index]; 
}

答案 1 :(得分:1)

我认为你应该为这种情况定义一个常量,而不是使用数字。在访问第一个元素是直观的事情的情况下,0并不总是“魔术”。示例:检查字符串的第一个字节,没有理由定义c_first_byte常量。)

但是在你的代码中,最好添加一个方法来形成一个名为x()的mData,它返回你想要的值。无需向其用户公开mDatashape的内部表示。

答案 2 :(得分:1)

但代码不能编译。因为,您没有使用decltype来推断返回类型。所有形状都有相同的宽度吗?

如果是,那么应该没问题。如果没有,那么更好的方法是提供默认参数。

  auto MapData::GetWidth(const size_t index = 0) -> decltype( mData.shape()[0]) { 
    return mData.shape()[index];  
  }