Как я могу назначить переменную экземпляра в C ++, когда локальная переменная имеет то же имя? - PullRequest
2 голосов
/ 02 февраля 2010

У меня есть определенный класс:

class MyClass 
{
    int x;
    public: 
        MyClass(int x); 
};

MyClass::MyClass(int x)
{ //Assign x here 
}

Однако я не могу инициализировать x в конструкторе, поскольку он имеет то же имя, что и переменная экземпляра. Есть ли способ обойти это (кроме изменения имени аргумента)?

Ответы [ 9 ]

12 голосов
/ 02 февраля 2010

Лучший вариант - использовать список инициализатора конструктора:

MyClass::MyClass(int x) : x( x ) { // Body }

Но вы также можете попробовать этот подход:

MyClass::MyClass(int x) { this->x = x; }
8 голосов
/ 02 февраля 2010

Однако я не могу инициализировать x в конструкторе, потому что он имеет то же имя, что и переменная экземпляра. Есть ли способ обойти это (кроме изменения имени аргумента)?

Так измените имя параметра!

class MyClass  
{ 
    int x; 
    public:  
        MyClass(int xInitVal);  
}; 

MyClass::MyClass(int xInitVal)
    :x(xInitVal)
{ // Don't assign x here.  
} 

Делая имя параметра таким же, как локальное, вы просто затрудняете чтение кода. Не делай этого. Практически каждое руководство по стилю, с которым вы столкнетесь, скажет вам, чтобы параметры не совпадали с именами членов. Немного здравого смысла, пожалуйста.

Всем людям, которые ответили:

 this->x = x; 

Не спрашивай меня о работе. Боже мой, вы сознательно пытаетесь вызвать проблемы.
Тот факт, что это выглядит ужасно, не означает, что это плохая идея.

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

3 голосов
/ 02 февраля 2010

в качестве отступления - вы действительно должны иметь соглашение об именовании для ваших переменных-членов, которое не конфликтует. Обычно это правила кодирования 1 или 2 для домов с ++. Затем, когда вы видите m_foo = bar, вы точно знаете, что происходит

мы используем

 int m_thingy;

Я также видел

 int _thingy;
 int thingy_

заранее извиняюсь, если вы знали это и не могли или не хотели этого делать

2 голосов
/ 02 февраля 2010

Вы можете использовать this для явной ссылки на текущий объект:

this->x = x;
2 голосов
/ 02 февраля 2010

this->x = x;

1 голос
/ 02 февраля 2010

Я настоятельно рекомендую вам просто изменить имена переменных. Неразбериха с дублирующими идентификаторами - это борьба без причины.

В своем коде я присваиваю всем параметрам функции префикс 'in' ("inValue"). Я даю всем закрытым переменным-членам префикс 'm' ("mValue").

0 голосов
/ 02 февраля 2010

это-> х = х не работает? Это то, что мы сделали (или использовали другое имя параметра).

0 голосов
/ 02 февраля 2010

Используйте указатель this

MyClass::MyClass(int x)
{
    this->x = x;
}

Конечно, во-первых, отсутствие таких имен, было бы лучшим решением.

0 голосов
/ 02 февраля 2010

Используйте this->x вместо.

...