2014-11-21 45 views
-2

我有一類就是像const是殺死我的C++程序的疾病。這次發生了什麼?

class HtmlRover 
{ 
public: 
    HtmlRover(const std::string::const_iterator &, const std::string::const_iterator &); 
    ~HtmlRover(); 
    // ... 
private: 
    /... 
    std::string::const_iterator _curIter; 
    const std::string::const_iterator _offend; 
    /... 
}; 

和我的編譯器是在構造函數的執行抱怨我的_offend實例:

HtmlRover::HtmlRover(const std::string::const_iterator & it1, const std::string::const_iterator & it2) 
{ 
    _curIter = it1; 
    _offend = it2; 
} 

它說

No vaiable overload "=" 

現在我知道這可能與const變量被設置爲變量的引用有關,bu那麼再次引用也是const,那麼問題是什麼?我知道const變量在未初始化的情況下不能存在,但這也不應該成爲問題,因爲_offend在初始化HtmlRover對象時正在初始化。

+3

,而不是試圖解決這個問題的語法,我會先問自己,爲什麼一個流浪的對象會需要緩存的迭代器。 http://en.wikipedia.org/wiki/Code_smell – tinkertime 2014-11-21 16:21:45

+2

問題標題爲'+ 1',錯誤概念和錯誤編碼風格(不使用初始化程序列表)的問題爲'-1'。 – rubenvb 2014-11-21 16:22:50

+0

使用初始化列表,因爲它現在'_offend'正在使用賦值運算符,因爲它是常量,顯然是不行的。 – Ylisar 2014-11-21 16:23:07

回答

8

由於_offendconst你需要使用一個基地成員初始化器將其值設置:

HtmlRover::HtmlRover(const std::string::const_iterator & it1, const std::string::const_iterator & it2) : 
    _offend(it2) 
{ 
    _curIter = it1;  
} 

這將是治療_curIter同樣雖然語言不會在堅持一個不錯的主意。

5

你有一個初始化列表來初始化常量成員:

HtmlRover::HtmlRover(const std::string::const_iterator & it1, 
        const std::string::const_iterator & it2) 
: _curIter(it1) // can be here 
, _offend(it2) // must be here 
{ 
} 
+0

@Bathsheba也是正確的,但我更喜歡這個答案,因爲在可能的情況下使用初始化列表總是更好,甚至對於除參考之外的其他成員。 – 2014-11-21 16:23:57

+0

是的,這個答案比我的更簡潔,有一個upvote! – Bathsheba 2014-11-21 16:42:56

相關問題