Bonjour à tous..
Voila j'ai un petit souci. Je programme une collection (class Collection), dont les éléments sont des ColItem (classe ColItem). Pour cela, je fais une liste chainée de ArrayElem (struct ArrayElem). Pour éviter d'utiliser des templates, les classes qui peuvent être mis dans la collection, héritent de ColItem.

Voici les déclaration et les prototypes:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
class ColItem
{
public:
	ColItem(void);
	~ColItem(void);
	virtual void Detruir();		// virtual pour le late-binding
	virtual void Afficher();
};
 
struct ArrayElem{
	ColItem* Elem;
	ArrayElem* next;
};
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
 
class Collection:
	public ColItem
{
 
private:
	ArrayElem *buffer;
	ArrayElem *last;
	ArrayElem *iter1;
	ArrayElem *iter2;
 
	void SetBuffer(ArrayElem* tBuff);
public:
	// constructeurs
	Collection();
	~Collection();
 
	//fonctions
	ColItem* Add(ColItem* bElem);
	void Add(char* bDesc,TAG* bTag);
	void Clear();
	void Afficher();
 
	// iterators:
	void bindIterator(ColIterator* bIter);
 
};
et enfin mon itérateur:
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
 
class ColIterator
{
private:
	ArrayElem *mCour;
	ArrayElem *mHead;
public:
	ColIterator();
	ColIterator(ArrayElem* head);
	~ColIterator();
 
	ColItem* getNext();
	bool elemExists();
	void gotoHead();
	void initHead(ArrayElem* head);
};
jusque là, tout est ok. J'arrive à faire marcher mon programme. Mais il y a un "mais".
Pour parcourir la collection, en utilisant les méthodes déclarées virtual (Afficher et Detruir), pas de problème:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
	Collection* listElseIfExpr;
	Collection* listElseIfCorps;
	ColIterator iterElseIfExpr;
	ColIterator iterElseIfCorps;
	...
	listElseIfExpr->bindIterator(&iterElseIfExpr);
	listElseIfCorps->bindIterator(&iterElseIfCorps);
	while (iterElseIfCorps.elemExists())
	{
		iterElseIfExpr.getNext()->Afficher();
		iterElseIfCorps.getNext()->Afficher();
	}
Mais si je veux accèder à des éléments typés.. Par exemple TypeItem dérive de ColItem et Types est une collection, et si je fais:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
	ColIterator iter1;
	TypeItem* Type1;
 
	Types->bindIterator(&iter1);
	while(iter1.elemExists()){
		Type1 = iter1.getNext();
 
		Type1->Afficher();
	}
la ligne Type1 = iter1.getNext(); donne une erreur de compilation:
Error 1 error C2440: '=' : cannot convert from 'ColItem *' to 'TypeItem *'
or iter1.getNext(); renvoi un ColItem* et Type1 est un TypeItem*. je croyais que c'était censé marcher.
Je veux bien déclarer Type1 en tant que ColItem* mais dans ce cas, comment je peux faire Type1->foncLamba(); sachant que foncLamba() est uniquement dans la classe TypeItem et pas dans ColItem ?

Il existe surement des méthodes pour faire cela proprement. Pour l'instant, je peux faire marcher mon truc en modifiant la ligne Type1 = iter1.getNext(); en Type1 = (TypeItem*)iter1.getNext(); mais bon les casts en C++, question propreté c'est pas ça. Merci d'avance