来自 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
不会消失吗?
最佳答案
很难说出你在问什么。对于初学者,类 B
需要一个构造函数才能编译,正是因为它包含
引用:该引用必须在构造函数中初始化,
之后永远无法更改。 C
也是如此。
当然你也可以用指针达到同样的效果,然后 您可以在构造函数运行后更改它们。并注册 一个局部变量的地址,它的生命周期比 局部变量通常不是一个好主意;如果它是你的听众 感兴趣的,监听器自己一般会做注册, 跟踪它已经注册的位置,并将在其注销自己 析构函数。 (它通常也会在收到 相关事件。)但你没有说你的实际问题是什么。
更一般地说,悬挂引用和指针是一个问题 关于所有语言;由于某种原因,听众变得 无关或不活跃,它必须自行注销。 C++ 不是 在这方面不同于任何其他语言。
关于c++ - 当按引用传递的参数存储在被调用者对象中,然后被调用者删除时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27156879/