OVH Cloud OVH Cloud

Déplacer une fonction

2 réponses
Avatar
Michael
Bonsoir à tous,

tout d'abord désolé pour le titre pas très inspiré :)

Soient les deux classes suivantes:

class Elemt
{
private:
public:
Elemt() {}
Elemt(int pos);

void Rename(const AnsiString & new_name);
};

class Liste
{
private:
public:
Elemt Sheet;

Liste();

Elemt& Add(const AnsiString & sheet_name);
Elemt& Move(const AnsiString & sheet_name, const AnsiString &
sheet_after);
};

Elemt& Liste::Add(const AnsiString & sheet_name)
{
//blabla
Sheet = Elemt(1);
Sheet.Rename(sheet_name);

return Sheet;
}

Elemt& Liste::Move(const AnsiString & sheet_name, const AnsiString &
sheet_after)
{
//blabla

return Sheet;
}

Là quand je veux déplacer un élément de la liste, je passe par une
fonction Move de Liste.

Liste->Add("sheet");
Liste->Move("sheet","toto");

Je voudrais pouvoir utiliser la syntaxe suivante:

Liste->Add("sheet")->Move("toto");

Donc ajouter cette fonction à Elemt:

Elemt& Elemt::Move(const AnsiString & sheet_after)
{
//blabla
return *this;
}

Le problème est que Elemt ne connait pas les autres éléments constituant
la liste...

Comment je peux résoudre ça?

Merci d'avance...

2 réponses

Avatar
Pierre Lairez
Le Fri, 17 Jun 2005 19:15:17 +0200, Michael
a écrit:


Comment je peux résoudre ça?

Merci d'avance...




Le mieux est sans doute d'implémenter un design avec des itérateurs. Une
fonction Add renvois un itérateur, une fonction Move prend en paramètre
deux itérateurs, une fonction Find te renvois un itérateur, etc.

Avec des itérateurs, du doit pourvoir écrire ça:
List->Add(string)->Move(iterator);

Avatar
Andre Heinen
On 17 Jun 2005 17:15:17 GMT, Michael
wrote:

Le problème est que Elemt ne connait pas les autres éléments constituant
la liste...

Comment je peux résoudre ça?


Avec un proxy:

#include <iostream>
#include <string>

class NonTrouve {}; // exception

class Liste;
class Element;

class Proxy {
friend class Liste;
Liste* pListe;
Element* pElement;
Proxy(Liste* pLs,
Element* pEl);
public:
void deplacer(const std::string& ou) const;
};

class Element { // tout est prive
friend class Liste;
std::string nom;
Element* suivant;
Element(const std::string& n,
Element* s);
};

class Liste {
Element tete;
public:
Liste();
Proxy ajouter(const std::string& nom);
void deplacer(const std::string& quoi,
const std::string& ou);
void deplacer(Element* pQuoi,
const std::string& ou);
void afficher() const;
};

int main() {
Liste ls;
ls.ajouter("pomme");
ls.ajouter("orange");
ls.ajouter("cerise");
ls.ajouter("noix").deplacer("orange");
ls.ajouter("ananas");
ls.ajouter("citron").deplacer("noix");
ls.afficher();
}

Proxy::Proxy(Liste* pLs,
Element* pEl)
: pListe(pLs), pElement(pEl) {
}

void Proxy::deplacer(const std::string& ou) const {
pListe->deplacer(pElement, ou);
}

Element::Element(const std::string& n,
Element* s)
: nom(n), suivant(s) {
}

Liste::Liste()
: tete("", 0) {
}

Proxy Liste::ajouter(const std::string& nom) {
Element* tmp = tete.suivant;
tete.suivant = new Element(nom, tmp);
return Proxy(this, &tete);
}

/**
* deplace l'element "quoi" juste avant l'element "ou"
**/
void Liste::deplacer(const std::string& quoi,
const std::string& ou) {
Element* i;
for (i = &tete ;
i->suivant != 0 && i->suivant->nom != quoi ;
i = i->suivant);
if (i->suivant == 0) throw NonTrouve();
deplacer(i, ou);
}

/**
* Deplace un element juste avant l'element "ou".
* Precondition: pQuoi pointe l'element juste
* avant l'element a deplacer.
**/
void Liste::deplacer(Element* pQuoi,
const std::string& ou) {
Element* tmp = pQuoi->suivant;
pQuoi->suivant = pQuoi->suivant->suivant;
Element* i;
for (i = &tete ;
i->suivant != 0 && i->suivant->nom != ou ;
i = i->suivant);
if (i->suivant == 0) throw NonTrouve();
// si cette exception est declenchee,
//la liste a ete endommagee
tmp->suivant = i->suivant;
i->suivant = tmp;
}

void Liste::afficher() const {
for (const Element* i = &tete ;
i->suivant != 0 ;
i = i->suivant) {
std::cout << i->suivant->nom << ' ';
}
std::cout << 'n';
}

--
André Heinen
Mon e-mail, encodé ROT13: n qbg urvara ng rhebcrnayvax qbg pbz
La FAQ: http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/