Как назвать параметры конструктора при использовании переменных без префиксов? - PullRequest
6 голосов
/ 09 марта 2011

Конечно, нет единственно правильного способа сделать это, но я даже не могу придумать какую-либо приличную схему именования, вот почему я спрашиваю здесь. (Итак: хотя все ответы будут субъективными , они все же будут полезными !)

Проблема заключается в следующем: для простых агрегатных структур мы не используем префиксы членов var.

struct Info {
  int x;
  string s;
  size_t z;

  Info()
  : x(-1)
  , s()
  , z(0)
  { }
};

Тем не менее иногда полезно предоставить ctor инициализатора для инициализации структуры, однако - я не могу придумать приличную схему именования параметров, когда наиболее естественные имена для них уже заняты самими переменными-членами:

struct Info {
  int x;
  string s;
  size_t z;

  Info(int x?, string s?, size_t z?)
  : x(x?)
  , s(s?)
  , z(z?)
  { }
};

Что другие люди используют в этой ситуации?

Ответы [ 8 ]

12 голосов
/ 09 марта 2011

Используйте одни и те же имена - они не сталкиваются.

"При поиске имени используется ... в выражении mem-initializer для конструктора (12.6.2), функцияимена параметров являются видимыми и скрывают имена объектов, объявленных в областях блока, класса или пространства имен, содержащих объявление функции. "3.4.1 C ++ 2003

7 голосов
/ 09 марта 2011

Зачем придумывать пре / постфиксы?Я просто использую то же имя.C ++ разработан для того, чтобы это работало.

struct Info {
  int x;
  string s;
  size_t z;

  Info(int x, string s, size_t z)
  : x(x)
  , s(s)
  , z(z)
  { }
};

Это прямо вперед.

5 голосов
/ 09 марта 2011

Я, как правило, использую префикс «а» - как в «все».

Info(int aX, string const & aS, size_t aZ);


struct Time {
  Time(time_t aUnixTime) : UnixTime(aUnixTime) {}
  time_t UnixTime;
};
3 голосов
/ 09 марта 2011

Я использую это:

struct Info {
  int x;
  string s;
  size_t z;

  Info(int x, string s, size_t z)
  : x(x)
  , s(s)
  , z(z)
  { }
};

Это может быть немного удивительно, но это совершенно законно.

Смотри также:

Можно ли использовать одинаковые имена для полей и параметров конструктора?

Наименование параметров для конструктора

3 голосов
/ 09 марта 2011

Полагаю, что пока вы используете список инициализации, вы можете использовать те же имена:

struct Info {
  int x;
  string s;
  size_t z;

  Info(int x, string s, size_t z) : x(x) , s(s) , z(z)
  { }
};

Если бы вам пришлось проделать некоторую работу для инициализации поля, вы все равно могли бы использовать те же имена, но это было бы немного менее удобно:

struct Example {
  char *c;
  size_t l;

  Example(char *c, size_t l) : l(l), c(new char[l])
  {
      // in the block c is the parameter and this->c is the member
      std::copy(c, c + l, this->c);
  }
};
3 голосов
/ 09 марта 2011

Что-то, что я видел здесь, использует завершающие подчеркивания для аргументов конструктора, например:

struct Info {
  int i, j;
  Info( int i_, int j_ ) : i( i_ ), j( j_ ) { }
};
1 голос
/ 09 марта 2011

Вы можете использовать имя параметра, идентичное именам членов (но некоторые находят, что это сбивает с толку).

Я видел использование префикса / суффикса для членов (_, m, my_популярны, в этом случае нет конфликта параметров) или для параметров (префикс p является самым популярным для этого использования в моем опыте).

0 голосов
/ 04 сентября 2017

В тех случаях, когда элементам просто задаются значения соответствующих параметров, используйте список инициализатора.Здесь использование одного и того же имени для переменной-члена и параметра абсолютно безопасно.Если вы не можете просто присваивать значения, но вынуждены вызывать функции, жизненно важно сделать имена членов и параметры легко различимыми, а также легко сделать связь видимой, здесь префикс или постфикс - хороший вариант.

В ответе Эрика предлагается префикс a, но я нахожу дополнительную работу по замене первой буквы или оригинального имени на верхний регистр для получения имени параметра чрезвычайно раздражающим, он не позволяет просто использовать copy & paste (Оставлять его без изменений не вариант, потому что вы не хотите наблюдать потенциальные изменения в значении, добавляя префикс для каждого отдельного случая).

Для случаев, когда список инициализатора не может использоваться, я придумал a_, который можно использовать в качестве префикса перед исходным именем.

struct Info {
    int value;
    char description[MAX_DESCRIPTION_SIZE];

    Info(int value, char* a_description)
    : value(value)
    {
        someSafeCopy(description, a_description);
    }
};
...