2015-04-16 47 views
0

我必須創建一個類,它觀察一個矢量,並在每次改變時都會收到通知。我的問題是,我的程序不會改變向量的內容。有人可以告訴我,我犯了一個錯誤嗎?列表觀察者不會「看到」更新

實施:

class IObserver 
{ 
public: 
    virtual void notify() = 0; 
    virtual ~IObserver(){}; 
}; 

class ObservableVector 
{ 
    vector<int> ov; 
    vector<IObserver*> registered; 
public: 
    void notifyObserver() 
    { 
     for (IObserver* el : registered) 
     { 
      el->notify(); 
     } 
    } 
    void add(int n) 
    { 
     ov.push_back(n); 
     notifyObserver(); 
    } 
    void registerObserver(IObserver* obs) 
    { 
     registered.push_back(obs); 
    } 
    const vector<int> & items() const 
    { 
     vector<int> it; 
     for (int el : ov) 
     { 
      it.push_back(el); 
     } 
     return it; 
    } 
}; 

class ListingObserver : public IObserver 
{ 
    ObservableVector & _ov; 
public: 
    ListingObserver(ObservableVector & ov) : _ov(ov) 
    { 
     _ov.registerObserver(this); 
    } 
    void notify() 
    { 
     vector<int> toNotify; 
     toNotify = _ov.items(); 

     cout << "Elements: " << endl; 
     for (int el : toNotify) 
     { 
      cout << el << endl; 
     } 
    } 
}; 

int main() 
{ 
    ObservableVector ov; 
    ListingObserver lo(ov); 
    //MeanObserver mo(ov); 
    ov.add(1); 
    ov.add(2); 
    ov.add(3); 
} 

回答

0

我想你的代碼,並沒有實際的反應。但是,項目函數中存在一個問題,因爲您正在返回對函數的本地堆棧中定義的變量的引用。換句話說,該函數結束後該變量不存在,因此稱爲toNotify的變量被設置爲空。

也許這是什麼導致你的錯誤,你可以通過簡單地返回ov來解決它,而不是將其元素複製到另一個變量並返回此變量。

+0

感謝您的幫助! :)它現在完美:) – LittleBunchie

2

問題與此功能

const vector<int> & items() const 
{ 
    vector<int> it; 
    for (int el : ov) 
    { 
     it.push_back(el); 
    } 
    return it; 
} 

在這裏,您創建一個本地矢量it,並返回對它的引用,但在功能到底該對象被銷燬。所以你返回一個引用到不存在的對象,因此你有未定義的行爲。

要糾正你的代碼,你可以decrale此功能

vector<int> items() const 

,並留下它的實現,因爲它是現在還是隻是做它像這樣

const vector<int> & items() const 
{ 
    return ov; 
} 
+0

非常感謝你!它現在完美的工作:) – LittleBunchie