可以将类引用作为参数发送给函数吗?

可以将类引用作为参数发送给函数吗?

问题描述:

当我研究观察者设计模式的一个很好的例子时,我偶然发现了这段代码。主要是,它得到错误,并采取暂时的[-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(); 
} 
+0

如果您使用的参考?我看到的一切都是使用指针。 – NathanOliver

这是非法的构造:

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