Création d'un panier en C++
Par Kevinternet

Le , par autran, Rédacteur
Devant me plonger dans le C++ pour maintenir un logiciel écrit dans les années 90, je propose dans ce post une implémentation d'un panier avec la STL.
je ne pense pas que ce type de developpment merite que d'être publié sur les sources DVP C++. Si quelq'un pense que je devrais au contraire le publier je leferai alors.

Voici le main.cpp pour que tout le monde comprenne ce que peut faire ce panier basique :
Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  
#include "Panier.h" 
  
int main(int argc, char* argv[]) 
{ 
	Panier * panier = new Panier(); 
	panier->ajouterArticle(1, 2, 50); 
	panier->ajouterArticle(2, 2, 100); 
	panier->ajouterArticle(3, 1, 150); 
	panier->ajouterArticle(1, 3, 50); 
	cout << panier->calculerPanier() << endl; 
	cout << panier->supprimerArticle(2) << endl;; 
	cout << panier->calculerPanier() << endl; 
	return 0; 
}
j'ai opté comme je l'aurai fait en PHP pur une ligne panier et un panier dont voici les sources:
LignePanier.h
Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once 
  
class LignePanier 
{ 
private: 
	int codeArticle; 
	int qteArticle; 
	int prixArticle; 
public: 
	LignePanier(int code, int qte, int prix); 
	int getCode(void); 
	int ajouterQte(int qte); 
	int calculerLigne(void); 
	LignePanier(const LignePanier &ligne); 
public: 
	~LignePanier(void); 
};
LignePanier.cpp
Code c++ : Sélectionner tout
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
#include "LignePanier.h" 
  
LignePanier::LignePanier(int code, int qte, int prix) 
{ 
	this->codeArticle = code; 
	this->qteArticle = qte; 
	this->prixArticle = prix; 
} 
  
LignePanier::~LignePanier(void) 
{ 
} 
int LignePanier::calculerLigne(void) 
{ 
	return (this->qteArticle * this->prixArticle); 
} 
LignePanier::LignePanier(const LignePanier &ligne) 
{ 
	this->codeArticle = ligne.codeArticle; 
	this->prixArticle = ligne.prixArticle; 
	this->qteArticle = ligne.qteArticle; 
} 
int LignePanier::ajouterQte(int qte) 
{ 
	this->qteArticle += qte; 
	return 0; 
} 
int LignePanier::getCode(void) 
{ 
	return this->codeArticle; 
}
Panier.h
Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once 
#include "LignePanier.h" 
#include <list> 
#include <iostream> 
#include <string> 
using namespace std ; 
class Panier 
{ 
private: 
	list<LignePanier> listeArticles;  
public: 
	Panier(void); 
	int ajouterArticle(int code, int qte, int prix); 
	LignePanier getArticle(int code); 
	int supprimerArticle(int code); 
	int calculerPanier(void); 
  
public: 
	~Panier(void); 
};
Panier.cpp
Code c++ : Sélectionner tout
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 "Panier.h" 
  
Panier::Panier(void) 
{ 
} 
  
Panier::~Panier(void) 
{ 
} 
  
int Panier::ajouterArticle(int code, int qte, int prix) 
{ 
	LignePanier ligne = this->getArticle(code); 
	if (ligne.getCode() == code)  
	{ 
		ligne.ajouterQte(qte); 
		this->supprimerArticle(code); 
	} 
	else  ligne = LignePanier(code, qte, prix); 
	this->listeArticles.push_back(ligne); 
	return 0; 
} 
  
LignePanier Panier::getArticle(int code) 
{ 
	for(list<LignePanier>::iterator iter = listeArticles.begin(); iter != listeArticles.end(); ++iter)  
	{ 
		if  (code == iter->getCode()) 
			return (*iter); 
	} 
	LignePanier li = LignePanier(0, 0, 0); 
	return li; 
  
} 
int Panier::calculerPanier(void) 
{ 
	int total = 0; 
	for(list<LignePanier>::iterator iter = listeArticles.begin(); iter != listeArticles.end(); ++iter)  
	{ 
		total += iter->calculerLigne(); 
	} 
	return total; 
} 
int Panier::supprimerArticle(int code) 
{ 
	for(list<LignePanier>::iterator iter = listeArticles.begin(); iter != listeArticles.end(); ++iter)  
	{ 
		if  (code == iter->getCode()) 
		{ 
			this->listeArticles.erase(iter); 
			return 0; 
		} 
	} 
	return 0; 
}


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster un commentaire

Avatar de ambroise_petitgenet ambroise_petitgenet - Membre du Club https://www.developpez.com
le 24/06/2015 à 12:12
Bonjour ,

Alors tout d'abord c'est un code simple et fonctionnel. C'est déjà pas mal voir énorme.

Après je ne suis pas sur que ce code soit robuste aux évolutions, même si en soit ce code ne demande pas à évoluer.
Je m'explique, mon soucis est sur les lignes de type :
Code c++ : Sélectionner tout
LignePanier li = LignePanier(0, 0, 0);

En fait ca marche bien parce que dans LignePanier il n'y a que des membres simples : int
Mais si on avait un pointeur sur quelque chose genre
Code c++ : Sélectionner tout
1
2
3
4
5
  
int codeArticle; 
int qteArticle; 
int prixArticle; 
char *designationArticle;

Je grossis le trait car on aurait plutôt utiliser une std::string, mans dans ce cas la ligne "LignePanier li = LignePanier(0, 0, 0);" pose soucis car on va recopier le pointeur et non refaire une allocation mémoire et y copier les données.
Ce qui veut dire avec
Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
  
LignePanier Panier::getArticle(int code) 
{ 
	for (list<LignePanier>::iterator iter = listeArticles.begin(); iter != listeArticles.end(); ++iter) 
	{ 
		if (code == iter->getCode()) 
			return (*iter); 
	} 
	LignePanier li = LignePanier(0, 0, 0); 
	return li; 
  
}
A la sortie de la fonction, si le destructeur de LignePanier libére la mémoire, on a designationArticle qui pointe sur une zone mémoire non disponible et donc lors de l'acces crash mémoire.

Autre exemple lors du egal
Code c++ : Sélectionner tout
1
2
3
  
LignePanier li1 = LignePanier(0, 0, 0); 
LignePanier li2 = li1;
Le faut de modifier designationArticle de li2, modifie designationArticle de li1.

Ce qu'il faudrait rajouter dans LignePanier c'est la surcharge de l'opérateur =.

Après c'est juste un point de vu personnel. Ce code fonctionne bien et il est lisible et c'est bien pour cela que j'ai vu le "possible" problème. Donc moi ça me va.

Allez je vais chipoter encore un peu
Je rajouterais des const pour éviter des modifications qui ne devrait pas exister

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  
  
class LignePanier 
{ 
private: 
	int codeArticle; 
	int qteArticle; 
	int prixArticle; 
public: 
	LignePanier( const int code, const int qte, const int prix); 
	int getCode(void) const; 
	int ajouterQte( const int qte); 
	int calculerLigne(void) const; 
	LignePanier(const LignePanier &ligne); 
public: 
	~LignePanier(void); 
};

Par exemple, mais bon c'est du chipotage

En tout cas je le redis code simple et efficace, c'est good

Ambroise
Avatar de G.castelain G.castelain - Nouveau membre du Club https://www.developpez.com
le 01/06/2017 à 1:13
Je me dis que ce genre de code c'est un truc qui peut être très puissant dans un arduino avec un petit jeu de led adressable. On a vite une petite caisse de préparation de commande ou d'enregistrement de stock marchandise.
Avatar de autran autran - Rédacteur https://www.developpez.com
le 04/06/2017 à 8:22
Oui Castelain, tu as raison il y a une opportunité.
Je n'y avais pas pensé.
Dommage que je n'ai jamais eu le courage de me pencher sur Arduino
Contacter le responsable de la rubrique C++