2014-10-31 71 views
1

我有一個自定義容器(「主題」),它被許多其他類所觀察。更換容器後,更改後將通知推送給所有觀察員。例如,對於調整大小,處理流程看起來參考自定義容器的C++觀察者模式

std::vector<double> vec; 

void resize(size_t n) 
{ 
    vec.resize(n);   //first resize 
    notify(Event::RESIZE); //afterwards inform observers about the resize event 
} 

現在,當我通過參考存取改變容器的元素,我看不出有什麼明顯的方法通知:當

double& operator[](size_t i) 
{ 
    notify(Event::CHANGE_ELEMENT); //no way to notify afterwards, so notify before 
    return vec[i]; 
} 

因此我改變的元素作爲

containerObject[2] = 1.1; 

觀察員得到了解的老態,這是通知後才更新。

是否有解決方法(除了使用setter方法)呢?

+0

我相信你的自定義容器不應該提供operator [](size_t)。可能是setter(),然後在應用更改後從setter發送通知。 – Jagannath 2014-10-31 23:05:49

回答

1

做一些輔助類,只是推銷通知。

struct MyHelper 
{ 
    //This is may be a friend of your container 

    MyHelper(std::size_t index, MyCustomContainer& ref) 
    : _index(index), _ref(ref) 
    { } 

    ~MyHelper() 
    { notify(Event::CHANGE_ELEMENT); } 

    double& operator=(double rhs) 
    { _ref._vec[_index] = rhs; } 

private: 
    std::size_t _index; 
    MyCustomContainer _ref; 
}; 

您可以在運營商這樣做,那麼:

MyHelper MyCustomContainer::operator[](size_t i) 
{ 
    MyHelper m(i, *this); 
    return m; 

    // MyHelper Destructor called 
} 

試試吧online

+1

在應用新狀態之前,這仍然會通知。 – Jagannath 2014-10-31 23:02:19

+0

感謝您的好主意,即使它可能無法正常工作。 – davidhigh 2014-10-31 23:09:33

+0

@Jagannath:你能詳細解釋一下爲什麼你的意思不起作用嗎? – davidhigh 2014-10-31 23:10:26