【问题标题】:Listing Observer doesn't "see" the updateListing Observer 没有“看到”更新
【发布时间】:2015-04-16 10:17:27
【问题描述】:

我必须创建一个类,它观察一个向量并在每次发生变化时得到通知。我的问题是,我的程序对改变向量的内容没有反应。谁能告诉我,我在哪里犯了错误?

实现:

    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);
}

【问题讨论】:

    标签: c++ class inheritance virtual-functions


    【解决方案1】:

    这个函数有问题

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

    在这里你创建一个局部向量it,并返回对它的引用,但在函数结束时这个对象被销毁了。所以你返回一个不存在的对象的引用,因此你有未定义的行为。

    要更正您的代码,您可以将此函数声明为

    vector<int> items() const
    

    并保持它现在的实现或使其简单地像这样

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

    【讨论】:

      【解决方案2】:

      我试过你的代码,它确实有反应。但是 items 函数中存在问题,因为您正在返回对在函数的本地堆栈上定义的变量的引用。也就是说,函数结束后那个变量就不存在了,因此调用toNotify的变量就被设置为空。

      也许这就是导致您的错误的原因,您可以通过简单地返回 ov 而不是将其元素复制到另一个变量并返回此变量来解决它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-23
        • 1970-01-01
        相关资源
        最近更新 更多