我想实现用于所有程序的Mediator
设计模式shared_ptr
。
这是Mediator interface
:
class Mediator
{
public:
Mediator(){ print("Mediator()"); }
virtual void Notify(std::shared_ptr<BaseComponent> sender) const = 0;
};
这是ExampleMediator
:
class ExampleMediator : public Mediator
{
private:
std::shared_ptr<ExampleComponent> eC;
public:
void Notify(std::shared_ptr<BaseComponent> sender) const override {
print("From Example Mediator");
}
void setExampleComponent(std::shared_ptr<ExampleComponent> eC_){
eC = eC_;
}
};
在ExampleMediator
具有共享指针ExampleComponent
和设置它的方法。
这是基类BaseComponent
:
class BaseComponent
{
protected:
std::shared_ptr<Mediator> m;
public:
BaseComponent() { print("BaseComponent()"); }
~BaseComponent() { print("~BaseComponent()"); }
void setMediator(std::shared_ptr<Mediator> m_){ m = m_; }
};
在BaseComponent
具有共享指针ExampleMediator
和设置它的方法。
这是ExampleComponent
:
class ExampleComponent: public BaseComponent
{
public:
ExampleComponent(){ print("ExampleComponent()"); }
~ExampleComponent(){ print("~ExampleComponent()"); }
void doSomethingOnDerived(){ print("ExampleComponent job");}
};
主要功能:
int main()
{
// Create the mediator
auto mM = std::make_shared<ExampleMediator>();
// Create the component
auto eC = std::make_shared<ExampleComponent>();
eC->setMediator(mM);
// Set the component in the mediator
mM->setExampleComponent(eC);
}
输出是:
Mediator()
BaseComponent()
ExampleComponent()
如果我删除该行mM->setExampleComponent(eC);
,则会调用构造函数。Compiler Explorer 中的实时代码:https : //godbolt.org/z/E5ofEPGen
我的目标是将组件用作共享指针而不是原始指针,中介器也是如此。
导致此问题的原因是什么?
谢谢。
导致此问题的原因是什么?
当指针是指向资源的最后一个所有者时,共享指针会破坏其拥有的资源。当局部变量eC
在 返回时被销毁时main
,还有另一个所有者,mM.eC
因此资源不会被销毁。同样,当本地mM
被销毁时,其资源仍为之前拥有的资源所拥有eC
。
当您拥有资源时,我们通常认为所有者“依赖”于该资源。如果我们将对象视为节点,将依赖关系视为边,我们会得到一个有向图。此依赖关系图不应有循环,因为这通常会导致您遇到的问题。
使用共享指针,打破循环的一种方法是削弱一个节点的所有权。这可以通过使用弱指针而不是共享指针来完成。请注意,您必须小心处理弱拥有资源在其依赖者之前被销毁的情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句