Bonjour à tous,

Question architecture d'objet, à priori.

je cherche une methode élégante (pas RTTI ou equivalent) et orientée objet pour coder un truc comme ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
vector<object2D*> v;
v.push_back(new square());
v.push_back(new square());
v.push_back(new circle());
v.push_back(new circle());
v.push_back(new circle());
v.push_back(new circle());
 
for (size_t i=0 ; i<v.size() ; i++)
	for (size_t j=0 ; j<v.size() ; j++)
		if (v[i]->collide(v[j]))
			cout << i << "<->" << j << = <<"collide\n";
j'ai une classe abstraite object2D et des classes dérivées d'object 2D : square et circle.
je cherche a detecter les collisions entre square/square et square/circle avec les object2D que j'ai dans un vecteur d'object2D abstrait.

un truc genre (gardez juste a l'esprit que c'est du pseudo code :p
rien ne compile, rien ne marche) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
class object2D
{
	virtual bool collide(object2D* o) = 0;
}
 
class square : public object2D
{
	bool collide (object2D* o) //redef virtual methode
	{
		o->collide(dynamic_cast<square*>(this));
	}
	bool collide (square* s)
	{
		//code
	}
	bool collide (circle* c)
	{
		//code
	}
}
 
class circle: public object2D
{
	bool collide (object2D* o) //redef virtual methode
	{
		o->collide(dynamic_cast<circle*>(this));
	}
	bool collide (square* s)
	{
		s->collide(dynamic_cast<circle*>(this));
	}
	bool collide (circle* c)
	{
		//code
	}
}
tel quel ca ne marche pas car on se base sur la méthode virtuelle object2D::collide(object2D*) qui est défini au niveau d'object2D le parcours des tables de methode virtuelle ne fait ressortir que les collides avec object2D en parametre (et masque les autres versions)

Quelqu'un à une idée de comment je pourrais faire autrement ?

Fraggy