如何在C ++中避免魔术字符串和魔术数字

时间:2019-06-04 08:37:56

标签: c++

如何避免在下面的代码中使用魔术字符串和数字:

void Trainee::setScores() {
  m_scores["C++"] = rand() % 100;
  m_scores["Java"] = rand() % 100;
  m_scores["Linux"] = rand() % 100;
  m_scores["QtQML"] = rand() % 100;
  m_scores["PSD"] = rand() % 100;
}

2 个答案:

答案 0 :(得分:1)

您可以在* .cpp文件的匿名名称空间中使用constexpr变量(如C中的静态变量)

namespace
{
    constexpr std::string cpp { "C++" };
}

void Trainee::setScores()
{
  m_scores[cpp] = 
}

答案 1 :(得分:0)

如果m_scores是一个std :: map,那么看起来,您只需浏览其所有内容即可:

for( auto & score : m_scores ) {
  score = rand() % 100;
}

此外,您可以添加一个函数来设置和保存模数到Trainee的成员变量中:

void Trainee::setScoresModulus( int modulus )
{
  m_modulus = modulus;
}

然后拥有:

void Trainee::setScores() {
  for( auto & score : m_scores ) {
    score = rand() % m_modulus;
  }
}

编辑:我想念这个功能是在构造地图的。提供所有分数名称的列表是一种解决方案:

void Trainee::setScores( vector<string> const& names ) {
  m_scores.clear();
  for( auto const& name : names ) {
    m_scores[ name ] = rand() % m_modulus;
  }
}