Можно ли отправить ссылку на класс в качестве аргумента функции?

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

Решение

Это плохо сформировано:

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

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


поскольку SensorSystem не своя его AlarmListeners, вы должны будете создать их заранее:

Gates gates;
Lighting lighting;
Surveillance surveillance;

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

Другие решения

Других решений пока нет …