【发布时间】:2014-11-26 18:56:30
【问题描述】:
来自 C,我对 C++ 的“引用”对象概念不熟悉。为了帮助自己弄清楚,我对观察者模式进行了稍微修改的实现。
A类:
class A
{
public:
A (int x) : m_x (x) {}
private:
int m_x;
}
B类:
class B
{
public:
void Register (A& listener) { m_currentListener = listener; }
private:
A& m_currentListener;
}
C类:
class C
{
public:
void RegisterNewDefaultListener ()
{
A tempA (42);
m_observer.Register (tempA);
m_lastRegisteredListener= tempA;
}
private:
B m_observer;
A& m_lastRegisteredListener;
}
我担心的是C#RegisterNewDefaultListener 方法:它创建了一个A 的本地实例,然后通过引用将它传递到两个不同的地方并将其存储起来。
但随后该本地实例立即超出范围,并被破坏。那些持有该引用的别名会发生什么?他们会失效吗?或者那个本地的A 在所有对它的引用都消失之前不会消失?
【问题讨论】:
-
是的,当对象被销毁时,这些引用将无效,并且任何访问成员变量或对该对象引用调用非静态成员函数的尝试都将导致未定义的行为。
-
顺便说一句:在 C++ 中,我们写成
C::RegisterNewDefaultListener(而不是#)。
标签: c++ reference scope pass-by-reference observer-pattern