gpt4 book ai didi

c++ - Listing Observer 没有更新 "see"

转载 作者:行者123 更新时间:2023-11-28 02:28:38 26 4
gpt4 key购买 nike

我必须创建一个类,它观察一个 vector 并在每次有变化时收到通知。我的问题是,我的程序不会对 vector 内容的更改使用react。有人可以告诉我,我在哪里犯了错误吗?

实现:

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

最佳答案

这个函数有问题

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

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

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

vector<int> items() const

并保留它现在的实现或者像这样简单地实现

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

关于c++ - Listing Observer 没有更新 "see",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29671745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com