0

クラスを指定すると、参照変数が変更されるたびに更新する必要があるメンバー変数がいくつかあります。boost::signalすべての従属変数の更新を支援するために使用したいと思います。

これがコードです。

#include <functional>
#include "boost/signal.hpp"
#include "boost/ref.hpp"
#include "boost/bind.hpp"

template<class T>
class AutoElement
{
public:
    AutoElement(T t) : m_element(t) {}
    typedef boost::function<void () > Handler;

    void Register(Handler h)
    {  m_signal.connect(h); }

    void operator() ()
    {  m_signal(); }

    void SetElement(T t)
    {  m_element = t; }

    T GetElement() const
    {  return m_element; }

private:
    T m_element;
    boost::signal<void ()> m_signal;
};

class AutoUpdateClass
{
public:
    AutoUpdateClass() : m_iBase(0)
    {        
        m_iBase.Register(boost::bind(&AutoUpdateClass::UpdateNumber, 
                         boost::ref(*this)));
        m_iBase(); // trigger handler(s)
    }

    void UpdateBase(int b)
    {
        m_iBase.SetElement(b);
        m_iBase(); // trigger handler(s)
    }

private:    
    void UpdateNumber() // m_iNumber is depended on m_iBase
    {   m_iNumber = m_iBase.GetElement() * 2; }

private:
    AutoElement<int> m_iBase; // the reference variable
    int m_iNumber;            // the variable depends on m_iBase
};

int main()
{
    AutoUpdateClass auc;
    // first m_iBase will be set and then m_iNumber will be updated.  
    auc.UpdateBase(40); 
}

質問> この設計に潜在的な問題はありますか? この種のタスクを実行するためのより良い方法はありますか?

4

1 に答える 1

0

と を無効AutoUpdateClass::AutoUpdateClass(AutoUpdateClass const&)にしAutoUpdateClass& AutoUpdateClass::operator=(AutoUpdateClass const&)ます。

または、それらを適切に実装します。

書かれているように、のコピーは、AutoUpdateClassそれ自体ではなく、コピー元のものへの参照を持ちます。

于 2013-01-01T15:57:25.267 に答える