2013-09-05 207 views
6

的自我初始化通過做這樣的事情已經被咬傷後:避免/警告C++成員

struct Person { 

    std::string first_name; 
    std::string last_name; 
    Person(const std::string &first_name_, const std::string &last_name_) : 
    first_name(first_name_), 
    last_name(last_name) 
    {} 
}; 

當初始化last_name(last_name)顯然應last_name(last_name_) 請問有什麼辦法可以讓GCC警告這樣的錯誤(是否有任何初始化成員使用自己的用例?)

或者在構造函數參數與字段類似的情況下,有更好的命名約定的建議。

+1

最普遍慣例是一個像「M」(部件)或「F」(場)的信前綴成員。像「mLastName」或「m_last_name」一樣。這不僅因爲這個特定的問題而有用,而且因爲如果它具有前綴,你立即就知道某些東西是成員變量。它也不太可能弄錯; 「_」後綴仍然允許自動完成來提示參數以及成員。有了前綴,這不會經常發生。 –

+0

@NikosC。當我開始編程時,我會在其他任何地方使用它,還有其他匈牙利符號,比如m_pfnFoo,用於函數指針等等。然後作爲一個實驗,我決定擺脫它,並且從不錯過它。我的印象是,當你的課堂精心製作時,它根本沒有任何好處。 – stijn

+0

@stijn我發現它非常有用,特別是在閱讀其他人的代碼時。它使它更容易理解它。使我不經常使用我的IDE的查找功能,這是一件好事:) –

回答

9

我通過使用相同的名稱作爲它們初始化的成員來避免此問題。查找規則指定該名稱在成員初始化程序中使用時引用該參數。

如果構造函數太複雜,會有細微的錯誤;但如果您只是在初始化列表中初始化成員,則沒有問題。

否則,GCC會給出一個警告,說明如何使用未初始化的值和合理的警告設置,如-Wall(或者可能是-Wextra),或者更具體地說是-Wuninitialized。我認爲如果你想更具體一些,可能還會有-Winit-self或類似的。

+3

+1。這是最好的,因爲它也避免了爲同一實體考慮兩個名稱。簡單的解決方案通常最好。 – Nawaz

+1

@JonasWielicki:夠公平的。我總是使用'-Wall -Wextra',而且從來不會遇到這個問題,所以我不知道你需要什麼。 –

+0

我剛剛測試過''-Wall'' *看起來*現在可以工作,這可能已經改變了與gcc 4.8。 –

7

是; -Wuninitialized-Winit-self

$ g++ -Wuninitialized -Winit-self -c init.cpp 
init.cpp: In constructor 'Person::Person(const string&, const string&)': 
init.cpp:7:3: warning: 'Person::last_name' is initialized with itself [-Wuninitialized] 
+0

我在「無法識別的選項」:)咯咯地笑:) – jrok

+1

@jrok呵呵 - 我不能爲我的生活拼命。 – trojanfoe

+0

當我使用g ++(直接構建對象)時,上述錯誤沒有。任何具體原因?即使有-Wall –