Pagina 1 di 1

[C++] Interfacce

MessaggioInviato: ven gen 12, 2007 12:44 am
da mciasco
Salve,

sto facendo un progetto in C++ e anche se non sono nuovo della programmazione ad oggetti (uso Java) non riesco ad usare il concetto di Interfacce con C++.

Attualmente vorrei avere una classe Player a cui voglio specificare degli obiettivi che deve compiere che chiamo ''target''. Siccome non so a priori che target voglio e vorrei rendere la cosa estendibile ho pensato di usare un'interfaccia ITarget e implementarla con varie classi (vari tipi di target). Solo che mi dà errori di compilazione!!

Io ho:

in ITarget.h
Codice: Seleziona tutto
#include "Player.h"

class ITarget {
public:
    //dichiarazione di un metodo dell'interfaccia che tutte le classi derivate
    //dovranno implementare
    virtual void doSomething(Player *p); 
    ...
};





in MyTarget.h (header di una classe derivata da ITarget)
Codice: Seleziona tutto
#include "ITarget.h"
#include "Player.h"

class MyTarget : public ITarget {
public:
    //dichiaro il metodo che la classe derivata deve implementare
    void doSomething(Player *p);
    ...
};





in MyTarget.cpp (che implementa il relativo MyTarget.h)
Codice: Seleziona tutto
#include "MyTarget.h"
#include "Player.h"

   //implementa il metodo dell'interfaccia
    void MyTarget::doSomething(Player *p) {
           //fa qualcosa con *p
    }
    ...
};





in Player.h
Codice: Seleziona tutto
#include "ITarget.h"

class Player {
public:
    ITarget *target; //puntatore ad una interfaccia ITarget
    ...
};



Ok quindi quello che vorrei fare è usare in Player.cpp (che qui non mostro) un'istanza di una classe derivata da ITarget, ad esempio MyTarget. Il problema è che non mi compila!

L'errore è:
in Target.h
variable or field doSomthing declared void
doSomething declared as a virtual field


La cosa magica è che se il metodo virtuale doSomething lo dichiaro come se prendesse void ossia ''virtual void doSomething(void)'' e tolgo ovviamente tutti gli #include ''Player.h'' che non servono più allora compila correttamente!

C'è qualcosa di sbagliato?