可以将类引用作为参数发送给函数吗?
问题描述:
当我研究观察者设计模式的一个很好的例子时,我偶然发现了这段代码。主要是,它得到错误,并采取暂时的[-fpermissive]的地址,我不明白它是坦率的。将类参考发送给函数?这是真实生活吗?可以将类引用作为参数发送给函数吗?
#include <vector>
#include <iostream>
using namespace std;
class AlarmListener
{
public:
virtual void alarm() = 0;
};
class SensorSystem
{
vector < AlarmListener * > listeners;
public:
void attach(AlarmListener *al)
{
listeners.push_back(al);
}
void soundTheAlarm()
{
for (int i = 0; i < listeners.size(); i++)
listeners[i]->alarm();
}
};
class Lighting: public AlarmListener
{
public:
/*virtual*/void alarm()
{
cout << "lights up" << '\n';
}
};
class Gates: public AlarmListener
{
public:
/*virtual*/void alarm()
{
cout << "gates close" << '\n';
}
};
class CheckList
{
virtual void localize()
{
cout << " establish a perimeter" << '\n';
}
virtual void isolate()
{
cout << " isolate the grid" << '\n';
}
virtual void identify()
{
cout << " identify the source" << '\n';
}
public:
void byTheNumbers()
{
// Template Method design pattern
localize();
isolate();
identify();
}
};
// class inheri. // type inheritance
class Surveillance: public CheckList, public AlarmListener
{
/*virtual*/void isolate()
{
cout << " train the cameras" << '\n';
}
public:
/*virtual*/void alarm()
{
cout << "Surveillance - by the numbers:" << '\n';
byTheNumbers();
}
};
int main()
{
SensorSystem ss;
ss.attach(&Gates());
ss.attach(&Lighting());
ss.attach(&Surveillance());
ss.soundTheAlarm();
}
答
这是非法的构造:
ss.attach(&Gates());
^^^
Gates()
是一个rvalue(具体地,prvalue)。你不能接受右值的地址。这不是一个具有身份的对象,因此它没有真正的地址。这种语言阻止你做一些没有道理的事情。如果你确实存储了一个指向这个临时对象的指针,那么你最终会得到一个悬挂指针,因为在这行结尾处会临时销毁Gates
。
由于SensorSystem
不自己其AlarmListener
S,你必须创建它们前面:
Gates gates;
Lighting lighting;
Surveillance surveillance;
SensorSystem ss;
ss.attach(&gates);
ss.attach(&lighting);
ss.attach(&surveillance);
如果您使用的参考?我看到的一切都是使用指针。 – NathanOliver