Я хочу изменить конструктор, чтобы использовать список инициализации, как в следующем примере:
class Foo
{
public:
Foo(std::wstring bar);
private:
std::wstring bar;
};
// VERSION 1:
Foo::Foo(std::wstring bar) {this->bar = bar}
// VERSION 2:
Foo::Foo(std::wstring bar) : this->bar(bar) {} // ERROR!
К сожалению, я не могу сделать версию 2, потому что вы не можете использовать this
указатель на элементы данных, поскольку (я предполагаю), что они еще не существуют на данный момент. Как тогда я справлюсь с проблемой скрытия имени (то есть мой параметр и мой элемент данных имеют одно и то же имя)?
Вам не нужно. Первый bar
будет относиться к члену и второй bar
будет ссылаться на аргумент:
Foo::Foo(std::wstring bar) : bar(bar) {}
Я бы изменил название аргумента, чтобы было понятно, какой именно.
Foo::Foo(std::wstring b) : bar(b) {}
Обратите внимание, что вам это не обязательно, но будущие разработчики вашего кода, вероятно, будут вам благодарны.
Альтернативный вариант:
В C ++ принято обозначать закрытые переменные-члены специальным соглашением об именах, например, завершающим подчеркиванием. Это хорошо решает эту проблему:
class Foo
{
public:
Foo(std::wstring bar);
private:
std::wstring bar_;
};
Foo::Foo(std::wstring bar) : bar_(bar) {}
Вы действительно можете сделать это:
Foo::Foo(std::wstring bar) : bar(bar) {}
Все инициализатор, используемый после :
должен ссылаться либо на базовый класс, либо на некоторый член. Это означает, что ваш bar
член не будет скрыт в этой точке.
Компилятор будет знать, что делать … просто удалите это->