2013-02-05 66 views
2

我要修改構造使用初始化列表,如下面的例子:因爲你不能使用this指針名躲藏在構造函數初始化列表

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版對於數據成員,因爲(我猜)他們目前還不存在。那麼,如何處理名稱隱藏問題(即我的參數和數據成員具有相同的名稱)?

回答

3

你不需要。第一bar將參考構件和第二bar將參考參數:

Foo::Foo(std::wstring bar) : bar(bar) {} 
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

實際上,你可以這樣做:在:後使用,必須指代一個基類或某些成員

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

一切初始化。這意味着您的bar成員在此時不會被隱藏。

1

編譯器會知道該怎麼做...只是刪除這個 - >

相關問題