0

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();
}
4

1 に答える 1

2

これは形式が正しくありません:

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

Gates()rvalue (具体的には、prvalue) です。右辺値のアドレスを取ることはできません。ID を持つオブジェクトではないため、取得できるアドレスは実際にはありません。この言語は、あなたが意味のないことをするのを妨げています。このテンポラリへのポインタを格納した場合、この行の最後でテンポラリGatesが破棄されるため、ダングリング ポインタになってしまいます。


は を所有SensorSystemていないため、前もって作成する必要があります。AlarmListener

Gates gates;
Lighting lighting;
Surveillance surveillance;

SensorSystem ss;
ss.attach(&gates);
ss.attach(&lighting);
ss.attach(&surveillance);
于 2016-03-03T14:42:26.190 に答える