我想修改构造函数以使用初始化列表,如下例所示:
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
指针作为数据成员,因为(我猜)它们在那时还不存在。那么,我如何处理名称隐藏问题(即我的参数和我的数据成员具有相同的名称)?
答案 0 :(得分:3)
你不需要。第一个bar
将引用该成员,第二个bar
将引用该参数:
Foo::Foo(std::wstring bar) : bar(bar) {}
答案 1 :(得分:2)
我会更改参数的名称,以便明确哪个是哪个。
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 :(得分:2)
你实际上可以这样做:
Foo::Foo(std::wstring bar) : bar(bar) {}
:
之后使用的所有初始值设定项必须引用基类或某个成员。这意味着您的bar
成员将不会被隐藏。
答案 3 :(得分:1)
编译器将知道该怎么做...只需删除this->