Newsgroup: it.comp.lang.c++
Titolo: Classi astratte e altro ...

Ciao a tutti,
devo risolvere un esercizio.
ho una classe che penso di implementare astratta Shape, astrazione di
una generica figura.
Ho una serie di sottoclassi Circle, Triangle,  Rectangle con gli
attributi delle figure in questione (raggio, ecc..)
Devo implementare una funzione intersect() che mi dica se due figure
anche diverse si intersacano o meno.
Dove inserireste il metodo ?
- Nella superclasse Shape? intersect (Shape* , Shape*), ma in questo
modo la classe non sarebbe più astratta e inoltre avrei visibilità degli
attributi delle varie figure?
Chi mi aiuta, grazie
Max



Dove inserireste il metodo ?
ti sei risposto da solo. Devi fare una funzione, non un metodo. Se
vuoi puoi anche scrivere dei metodi che richiamino quella funzione, ma
io cmq farei una cosa del genere:
template<class A, class B> bool intersect(A,B);
template<> 
bool intersect<Triangle, Triangle> (Triangle t1, Triangle t2) 
{ /*....*/ }
template<>
bool intersect<Triangle, Circle> (Triangle t, Circle c)
{ /* ... */ }
se poi vuoi metterli anche come metodi:
class Triangle {
public:
	template<class T> bool intersect(T other_shape) {
		return intersect(*this, other_shape);
	}
};
Ciao Anto
--
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

Max wrote:

Poichè l'intersezione è una "funzione" dipendente esclusivamente dalla 
tipologia delle due shape credo che ti convenga creare delle funzione 
indipendente del tipo
intersect( Circle *, Triangle * ){ }
intersect( Circle *, Rectangle * ){ }
intersect( Rectangle *, Triangle * ){ }
[...]

attributi delle varie figure?
Una simile funzione sinceramente mi sembra troppo dipendente dal tipo
di figura usata per essere implementata come membro della classe base.
Il Ghenio
-----
ZIO : Fun and games are over with. Anyone who dares
get in my way shall perish.
-----

 attributi delle varie figure?
Se e' un metodo di Shape non ha bisogno di due parametri, uno dei due e' this.
Inoltre dubito fortemente che la funzione intersect debba modificare le shape
con cui lavora, ergo conviene inserirci qualche const. Usare i puntatori o le
reference in questo caso mi sembra una questione di gusti. Puoi sempre fare un
overload ed implementarla sia con i puntatori che con le reference.
Non capisco perche' dici che la classe non sarebbe piu' astratta. Una classe e'
astratta se uno qualsiasi dei suoi membri e' virtuale puro. L'inserimento del
metodo intersect non rende la classe meno astratta.
Ovviamente ne nel metodo della classe base ne nella funzione esterna hai
visibilità agli attributi delle classi derivate. Ma l'uso del polimorfismo
consiste proprio nel non farne uso a livello di algoritmo generico. Solo i
sottoalgoritmi (che saranno implementati come funzioni virtuali di shape)
avranno bisogno di accedere agli attributi.
Comunque tutto dipende da come intendi implementare il test dell'intersezione,
da come definisci l'intersezione e da cosa puo' e cosa non puo' essere un
derivato da shape (ovvero quale e' l'astrazione di shape).
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556