[C++] Interfacce
Inviato: ven gen 12, 2007 12:44 am
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
in MyTarget.h (header di una classe derivata da ITarget)
in MyTarget.cpp (che implementa il relativo MyTarget.h)
in Player.h
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 è:
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?
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?