Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 名称隐藏在构造函数初始化列表中_C++_Constructor_Initialization_This_Name Hiding - Fatal编程技术网

C++ 名称隐藏在构造函数初始化列表中

C++ 名称隐藏在构造函数初始化列表中,c++,constructor,initialization,this,name-hiding,C++,Constructor,Initialization,This,Name Hiding,我想修改构造函数以使用初始化列表,如下例所示: 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! 不幸的是,我

我想修改构造函数以使用初始化列表,如下例所示:

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
指针,因为(我猜)它们当时还不存在。那么,我如何处理名称隐藏问题(即我的参数和我的数据成员具有相同的名称)?

您不需要这样做。第一个
条将引用成员,第二个
条将引用参数:

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

之后使用的所有初始值设定项都必须引用基类或某个成员。这意味着此时不会隐藏您的
成员。

编译器将知道该做什么。。。只需删除此->