2017-12-29 48 views
0

나는 C++로 많은 것을한지 꽤 오래되었습니다. Observer 클래스의 파생 클래스를 전달하고이를 vector<Observer>에 저장함으로써 관찰 가능한 패턴을 구현하려고합니다. registerObserver() 메서드에서 notify() 메서드를 호출하면 파생 클래스 메서드를 호출하기 때문에 파생 클래스 개체를 전달하고 있음을 알고 있습니다. 벡터에서 객체를 꺼내고 notify 메소드를 호출하면 기본 클래스 메소드가 생깁니다.파생 클래스 메서드를 호출하려면 어떻게해야합니까?

나는 파생 클래스의 복사본을 기본 클래스 개체로 생성하는 push_back(observer) 또는 문제의 원인이되는 for(Observer o : observers) {을 호출하는 것이 좋습니다 (또는 둘 다).

기본 클래스

// Observer.h 
class Observer 
{ 
    public: 
    virtual void notify(); 
}; 

// Observer.cpp 
void Observer::notify() 
{ 
    Serial.println("got a notification in base class"); 
} 

파생 클래스

// DatabaseUpdater.h (derived class) 
class DatabaseUpdater : public Observer 
{ 
    public: 
    void notify() override; 
}; 

// DatabaseUpdater.cpp 
void DatabaseUpdater::notify() 
{ 
    Serial.println("got a notification in database class"); 
} 

대상 클래스

// HwMonitor.h (subject class) 
class HwMonitor 
{ 

    public: 
    void registerObserver(Observer& observer); 
    void event(); 

    private: 
    std::vector<Observer> observers; 
}; 

//HwMonitor.cpp 
void HwMonitor::registerObserver(Observer &observer) 
{ 
    Serial.println("adding observer"); 
    observer.notify(); 
    observers.push_back(observer); 
} 

void HwMonitor::event() 
{ 
    Serial.println("event"); 
    for(Observer o : observers) { 
     o.notify(); 
    } 
} 

"메인"(다음은

관심의 코드 Ardunio)

//app.ino 
DatabaseUpdater o; 
HwMonitor esp; 

void setup() 
{ 
    Serial.begin(115200); 
    delay(2000); 
    Serial.println("registering observer"); 
    esp.registerObserver(o); 
} 

void loop() 
{ 
    Serial.println("calling an event"); 
    esp.event(); 
    delay(1000); 
} 
+5

'HwMonitor'의 벡터는 다형성에 필요한 참조 또는 포인터가 아닌 * 객체 *를 저장합니다. [object slicing *에 대해 읽어보십시오.] (http://stackoverflow.com/questions/274626/what-is-object-slicing). –

+0

"흥미롭게 반복되는 템플릿 패턴"을 찾으십시오. https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern –

+0

@Someprogrammerdude 감사합니다. 나는이 일이 일어난 것으로 추측했지만 어디에 있는지 확신하지 못했습니다. – nPn

답변

0

개체를 슬라이스, ObserverDerivedObserver, 벡터는 저장 저장할 때 당신은 vector<Observer>가있는 경우. 파생 된 객체를 유지하려면 객체 참조 (포인터)를 저장해야합니다. 물론, 파생 된 객체가 실제로 나중에 호출되도록 살아 있어야한다는 것을 의미합니다.

관련 문제