В конкретном стандарте кодирования, который применяется на моем рабочем месте, методы доступа в классе следуют конкретному соглашению об именах. Для любой заданной переменной-члена геттер имеет одно и то же имя, а сеттер имеет префикс Set
. См. Пример ниже.Функция Enum & class member с тем же именем
class Foo
{
public:
int Number() const { return m_number; }
void SetNumber(int number) { m_number = number; }
private:
int m_number;
};
Это становится изворотливым, когда у меня есть перечисление с тем же именем:
enum class Number
{
One, Two, Three
};
class Foo
{
public:
Number Number() const { return m_number; }
void SetNumber(Number number) { m_number = number; }
private:
Number m_number;
};
Приведенный выше пример не будет компилировать, потому что в некоторых местах, компилятор не может определить, если я имею в виду имя перечисления или имя функции. Таким образом, чтобы исправить это, не нарушая стандарт кодирования, я бы использовать ::
в местах неоднозначности, и я на самом деле со ссылкой на перечисление:
enum class Number
{
One, Two, Three
};
class Foo
{
public:
::Number Number() const { return m_number; }
void SetNumber(::Number number) { m_number = number; }
void DoStuffWithNumber()
{
if (m_number == ::Number::One)
{
// Do stuff
}
}
private:
Number m_number;
};
Это немного запутанным для читателей кода, но и немного раздражает, чтобы полностью определить имя перечисления в определенных контекстах. Это не просто все время.
Что является более разумным обходным решением здесь? Очевидно, я мог бы сделать что-то вроде переименования аксессора на GetNumber()
, но мне любопытно узнать, какие другие решения могут придумать.
Ну, вы не можете изменить имя получателя, можете ли вы? это стандарт кодирования на рабочем месте. Итак, как насчет того, чтобы имя перечисления было множественным? –
Как вы относитесь к созданию буровой установки и простому оператору преобразования ('operator Number() {return m_number;}')? – NathanOliver
@NathanOliver Это менее интуитивно понятно, ИМХО. Личные предпочтения - избегать операторов, если я не реализую что-то с семантикой, которые очевидны и четко определены (операции копирования/перемещения, потоки, арифметические типы и т. Д.). –