gpt4 book ai didi

引用自定义容器的 C++ 观察者模式

转载 作者:太空宇宙 更新时间:2023-11-04 11:25:58 25 4
gpt4 key购买 nike

我有一个自定义容器(“主题”),它被许多其他类观察到。当容器发生变化时,通知会在发生变化后推送给所有观察者。例如,对于调整大小,流程看起来是

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 方法)?

最佳答案

制作某种辅助类,它只是在销毁时推送通知。

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

然后您可以在您的运算符(operator)中执行此操作:

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

// MyHelper Destructor called
}

试一试 online !

关于引用自定义容器的 C++ 观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26684546/

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