2011-07-13 16 views
8

He estado implementando un patrón de observador barebones y estoy atascado en un error algo críptico: "Tipo base de referencia de miembro 'Observer *' es no una estructura o unión ". Supongo que esto tiene algo que ver con mi uso de plantillas, con lo cual todavía estoy bastante incómodo. Aquí está el código infractor (la mayoría de los contras/destructores retiradas para simplificar las cosas): interfazProblema Implementando patrón de observador: "Tipo de base de referencia de miembro ________ no es una estructura o unión"

Asunto:

class Subject { 
public: 
    virtual void notify(); 
private: 
    list< Observer * > m_observers; 
}; 

Asunto aplicación:

void Subject::notify() { 
    list< Observer * >::iterator i; 

    for (i = m_observers.begin(); i != m_observers.end(); i++) { 
     *i->update(this);      // ERROR !!! ERROR 
} 

Observador interfaz abstracta:

class Observer { 
public: 
    virtual ~Observer(); 
    virtual void update(Subject * changedSubject) = 0; 

protected: 
    Observer(); 
}; 

Interfaz del observador de hormigón:

class ConcreteObserver: public Observer { 

public: 
    ConcreteObserver(ConcreteSubject *); 
    virtual ~ConcreteObserver(); 

    virtual void update(Subject * changedSubject); 

private: 
    ConcreteSubject * m_subject; 
}; 

aplicación Observador Hormigón:

void ConcreteObserver::update(Subject * changedSubject) { 
    if (changedSubject == m_subject) { 
     report(); 
    } 
} 

Si alguien puede ayudar a identificar este problema, que sería de gran aprecio.

Saludos, Nick

+0

intenté '(* i) -> actualizar (esto);'? – Vlad

Respuesta

12

el problema es con la precedencia de los operadores. En lugar de:

*i->update(this); 

Uso:

(*i)->update(this); 

De lo contrario, se interpretará como *(i->update(this)), que intenta llamar a un método en un puntero, lo que resulta en el mensaje de error.

+0

Ahhhh. Gracias interjay, funciona genial. Recuerdo esto ahora, desde un curso de ciencia ficción de cuando. Debería quedarse mejor esta vez. – user810962

+0

¡Gracias, esto me ayudó en Objective-C! – hellozimi

+0

Yo también, estaba pasando un objeto por referencia y cuando traté de establecer una de sus propiedades, recibí el error anterior. Entonces * referencedObject.name = @ "Bruce" obtuvo un error, (* referencedObject) .name = @ "Bruce" está bien. En realidad, no, el error que obtuve fue "Problema semántico: el tipo base de referencia del miembro 'GoodClass * __ autoreleasing *' no es una estructura o unión". Pero la solución funciona de todos modos. –

Cuestiones relacionadas