Listing Observer 没有 "see" 更新
Listing Observer doesn't "see" the update
我必须创建一个 class,它会观察一个矢量,并在每次其中发生变化时收到通知。我的问题是,我的程序不会对矢量内容的更改做出反应。有人可以告诉我,我在哪里做错了吗?
实施:
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);
}
我试过你的代码,它确实有反应。但是,items 函数中存在问题,因为您要返回对在函数的本地堆栈上定义的变量的引用。换句话说,函数结束后那个变量不存在,因此调用toNotify的变量被设置为空。
也许这是导致错误的原因,您可以通过简单地返回 ov 而不是将其元素复制到另一个变量并返回此变量来解决它。
这个函数有问题
const vector<int> & items() const
{
vector<int> it;
for (int el : ov)
{
it.push_back(el);
}
return it;
}
这里你创建了一个局部向量it
,return引用它,但是在函数结束时这个对象被销毁了。所以你 return 引用了不存在的对象,因此你有未定义的行为。
要更正您的代码,您可以将此函数声明为
vector<int> items() const
并保留它现在的实现,或者像这样简单地实现它
const vector<int> & items() const
{
return ov;
}
我必须创建一个 class,它会观察一个矢量,并在每次其中发生变化时收到通知。我的问题是,我的程序不会对矢量内容的更改做出反应。有人可以告诉我,我在哪里做错了吗?
实施:
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);
}
我试过你的代码,它确实有反应。但是,items 函数中存在问题,因为您要返回对在函数的本地堆栈上定义的变量的引用。换句话说,函数结束后那个变量不存在,因此调用toNotify的变量被设置为空。
也许这是导致错误的原因,您可以通过简单地返回 ov 而不是将其元素复制到另一个变量并返回此变量来解决它。
这个函数有问题
const vector<int> & items() const
{
vector<int> it;
for (int el : ov)
{
it.push_back(el);
}
return it;
}
这里你创建了一个局部向量it
,return引用它,但是在函数结束时这个对象被销毁了。所以你 return 引用了不存在的对象,因此你有未定义的行为。
要更正您的代码,您可以将此函数声明为
vector<int> items() const
并保留它现在的实现,或者像这样简单地实现它
const vector<int> & items() const
{
return ov;
}