Имя, скрывающееся в списке инициализации конструктора

Я хочу изменить конструктор, чтобы использовать список инициализации, как в следующем примере:

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 указатель на элементы данных, поскольку (я предполагаю), что они еще не существуют на данный момент. Как тогда я справлюсь с проблемой скрытия имени (то есть мой параметр и мой элемент данных имеют одно и то же имя)?

2

Решение

Вам не нужно. Первый bar будет относиться к члену и второй bar будет ссылаться на аргумент:

Foo::Foo(std::wstring bar) : bar(bar) {}
3

Другие решения

Я бы изменил название аргумента, чтобы было понятно, какой именно.

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) {}
2

Вы действительно можете сделать это:

Foo::Foo(std::wstring bar) : bar(bar) {}

Все инициализатор, используемый после : должен ссылаться либо на базовый класс, либо на некоторый член. Это означает, что ваш bar член не будет скрыт в этой точке.

2

Компилятор будет знать, что делать … просто удалите это->

1
По вопросам рекламы [email protected]