2016-03-03 6 views
0

Я наткнулся на этот фрагмент кода, когда я исследовал его для хорошего примера для шаблона проектирования Observer. В основном, он получает ошибку, принимая адрес временного [-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

ответ

2

Это плохо образован:

ss.attach(&Gates()); 
     ^^^ 

Gates() является Rvalue (в частности, prvalue). Вы не можете взять адрес rvalue. Это не объект, который имеет личность, поэтому на самом деле нет адреса, который вы можете взять. Язык препятствует вам делать то, что не имеет смысла делать. Если вы сохранили указатель на это временное, вы просто закончите с висячим указателем, так как в конце этой строки временный Gates будет уничтожен.


Поскольку SensorSystem не собственный его AlarmListener s, вы должны создать их фронт:

Gates gates; 
Lighting lighting; 
Surveillance surveillance; 

SensorSystem ss; 
ss.attach(&gates); 
ss.attach(&lighting); 
ss.attach(&surveillance); 

 Смежные вопросы

  • Нет связанных вопросов^_^