2013-10-17 76 views
1

通過const引用傳遞對象意味着我們不能修改它的任何成員。但假設該對象包含一個vector<string>成員。我們如何編寫const方法來讀取vector<string>成員的內容,並假定還需要vector<string>::iterator成員,並且必須在每次讀取之後更新以指向該向量中的下一個元素?如何修改/更新由const引用傳遞的對象的內部狀態

這是可能的,還是在這種情況下有另一種方法?也就是說,不要修改const引用對象傳遞的內容,但對象應該能夠更新它的內部狀態(即要讀取的向量中的下一個元素)。

+0

您可以用'矢量 :: const_iterator'來遍歷向量呢? – simonc

+0

我想修改迭代器,它是通過const引用傳遞的對象的成員(即我無法修改它)。正如其他人所指出的那樣,聲明該成員是可變的,似乎是答案。 – mihai

+0

如果你想修改它,爲什麼你把它作爲'const&'來傳遞? –

回答

2

這聽起來像你正在尋找關鍵字mutable。可變成員變量在const成員方法中是可修改的。你可以閱讀關於它here。舉個例子:

class A 
{ 
    std::vector<int> v_; 
    mutable std::vector<int>::const_iterator current_; 

public: 
    int get() const // note the const 
    { 
     assert(!v_.empty()); 
     if(current_ == v_.end()) current_ = v_.begin(); 
     return *current_++; 
    } 
}; 

注意你仍然需要const_iterator作爲載體本身是常量,因此v_.begin()不給你一個正常的迭代器。你可能通過將載體本身也標記爲mutable來解決這個問題,那麼你可以使用iterator

這是一個完整的live example

+0

it_應該是current_,對吧?是的,這聽起來像我正在尋找的解決方案。但是當我嘗試在const方法內的向量(it_ = v_.begin())的開始處設置迭代器時,我得到了一個「錯誤:'operator''不匹配'。 – mihai

+0

@Mihai更新了我的答案。 –

+0

回答這個問題,但我的黑客米是抽搐。因爲它可能是真實*問題,所以無法贊成。 –

1

如果您有會員想要修改const方法 - 聲明他們mutable

0

不要做:如果你想有一個像第一個(),未來(),最後語義()進行迭代的容器,創建一個代理:

Proxy iteration() const { return Proxy(*this); } 
相關問題