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

How to avoid magic strings and magic numbers in C++

本文关键字:魔术 字符串 数字 C++      更新时间:2023-10-16

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

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;
}

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

namespace
{
    constexpr std::string cpp { "C++" };
}
void Trainee::setScores()
{
  m_scores[cpp] = 
}

如果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;
  }
}