Adaptation Modern C++ sur du Legacy Code
Bonjour !
Je dois maintenir une application construite avant le C++11. L’application fonctionne grosso modo de cette façon :
Voici le code d'avant :
Code:
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
#include <iostream>
#include <list>
class A // construite pour l'exemple ...
{
public:
A(int _nbr, int _valeur){
nbr=_nbr; valeur =_valeur;
}
~A(){};
int getNbr() {return nbr;} // pour avoir des fonctions à utiliser
int getValue() {return valeur;} // pour avoir des fonctions à utiliser
void setValue(int _v) { valeur = _v;} // pour avoir des fonctions à utiliser
private:
int nbr;
int valeur;
};
int main(int argc, char **argv)
{
std::list<A*> myList;
A* tmp = nullptr;
//creation avec new
for(int i=0;i<7; i++)
myList.push_back(new A(i, 3*i-1));
// affichage de la liste
for(auto l : myList)
std::cout << l->getNbr() << " " << l->getValue() << std::endl;
//suppression des éléments impairs
for(auto it = myList.begin(); it !=myList.end(); it++) {
if ((*it)->getNbr()%2) {
delete (*it);
myList.erase(it);
it--;
}
}
// recherche d'un élément particulier i=4
for(auto it = myList.begin(); it !=myList.end(); it++) {
if ((*it)->getNbr()==4) {
tmp = (*it);
break;
}
}
// plus tard ... modification de l'élément tmp
if (tmp != nullptr) {
tmp->setValue(-8);
}
// affichage de la liste
for(auto l : myList)
std::cout << l->getNbr() << " " << l->getValue() << std::endl;
//suppression totale
for(auto it = myList.begin(); it !=myList.end(); it++) {
delete (*it);
myList.erase(it);
it--;
}
myList.clear();
return 0;
} |
J'ai travaillé sur le code et les smart-pointers afin de réduire la dette technique du logiciel :
Code:
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
#include <iostream>
#include <list>
#include <memory>
#include <algorithm>
class A // construite pour l'exemple ...
{
public:
A(int _nbr, int _valeur){
nbr=_nbr; valeur =_valeur;
}
~A(){};
int getNbr() {return nbr;} // pour avoir des fonctions à utiliser
int getValue() {return valeur;} // pour avoir des fonctions à utiliser
void setValue(int _v) { valeur = _v;} // pour avoir des fonctions à utiliser
private:
int nbr;
int valeur;
};
int main(int argc, char **argv)
{
std::list< std::shared_ptr<A> > myList;
std::shared_ptr<A> tmp;
//creation d'élements dans une liste
for(int i=0;i<7; i++)
myList.push_back( std::make_shared<A>(i, 3*i-1) );
// affichage de la liste
for(auto l : myList)
std::cout << l->getNbr() << " " << l->getValue() << std::endl;
//suppression des éléments impairs
myList.remove_if( [](std::shared_ptr<A> a) { return a->getNbr()%2; } );
//recherche d'un élément particulier i=4
auto it = find_if(myList.begin(), myList.end(), [](std::shared_ptr<A> a) { return a->getNbr()==4; } );
if (it != myList.end())
tmp = (*it);
//plus tard ... modification de l'élément tmp
if (tmp != nullptr)
tmp->setValue(-8);
// affichage de la liste
for(auto l : myList)
std::cout << l->getNbr() << " " << l->getValue() << std::endl;
//suppression totale
myList.clear();
return 0;
} |
Je me suis débarrassé de la gestion des pointeurs et cela me ravit.
Toutefois, est ce que je peux encore améliorer mon travail en C++ "moderne" sur cet exemple ?
Je vous en remercie d'avance !