Correction examen c++ aide [Résolu]

Majestick 20 Messages postés jeudi 26 février 2015Date d'inscription 2 octobre 2015 Dernière intervention - 26 févr. 2015 à 12:11 - Dernière réponse : Majestick 20 Messages postés jeudi 26 février 2015Date d'inscription 2 octobre 2015 Dernière intervention
- 26 févr. 2015 à 18:04
Bonjour,

Edit suppression de l'avis de doublon


Je vous contacte car j'ai un examen en C++ (à l'écrit) vendredi. J'ai une annale à laquelle j'ai répondu et je souhaiterais savoir si vous pourriez jeter un coup d'oeil aux réponses que j'ai apporté.
Je vous joins l'annale et mes réponses:



Et voici mon code:
Client.h
#ifndef __annale2014__client__
#define __annale2014__client__

//#include "agenceLocale.h"
#include <iostream>
#include <string>

using namespace std;
class Client {
 string nom;
 string adresse;
 AgenceLocale& agenceLocale;

 public:
  Client(string n, string a, AgenceLocale& al);

  AgenceLocale operator();
  void afficher();
};
#endif /* defined(__annale2014__client__) */


Client.cpp

#include "client.h"

Client(string n="",string a="", AgenceLocale& al):this->nom(n), this->adresse(a), this->agenceLocale(al){}
AgenceLocale operator() {return this->agenceLocale->nom;}
void afficher() {cout << this->nom << this->adresse << this->*agenceLocale;}



Employe.h

#ifndef __annale2014__employe__
#define __annale2014__employe__

#include "agenceLocale.h"
#include <iostream>
#include <string>

using namespace std;

class Employe {
 string nom;
 int id;
 AgenceLocale *agl;

 public:
  Employe(string ="", int i = 0);
  virtual void afficher();
  virtual void calculerSalaire() = 0;
};
#endif /* defined(__annale2014__employe__) */



Employe.cpp

#include "employe.h"

Employe(string ="", int i = 0):this->nom(n), this->id(i) {this->agl = new AgenceLocale();}
virtual void afficher() {cout << this->nom << this->id << this->*agl;}
virtual void calculerSalaire() = 0;




Commercial.h

#ifndef __annale2014__commercial__
#define __annale2014__commercial__

#include <iostream>
#include <string>

using namespace std;
class Commercial:public Employe {
 float pourcentage;
 float fixe;

 public:
  Commercial(string n="", int i =0, float p=0.0, float f=0.0);
  public void calculerSalaire();
}
#endif /* defined(__annale2014__commercial__) */



Commercial.cpp

#include "commercial.h"

Commercial(string n="", int i =0, float p=0.0, float f=0.0):Employer(n,i), pourcentage(p), fixe(f) {}
public void calculerSalaire(){}



AgenceLocale.h

#ifndef __annale2014__agenceLocale__
#define __annale2014__agenceLocale__

#include "region.h"
#include "employe.h"
#include "client.h"
#include "vente.h"
#include <iostream>
#include <string>
#include <list>

using namespace std;
class AgenceLocale {
 string nom;
 Region& nomR;
 int nbEmp;
 Employe * employe;
 list<Client> c;
 list<Vente> v;

 public:
  AgenceLocale(string n, Region& r, int nb);
  AgenceLocale(const AgenceLocale& copie);

  void addEmploye(string nom, int id);
  Vente AgenceLocale::operator[](int i);
  ostream& operator<<(ostream& out, Client& c);
  float calculerSalaire();
  float salaireCommerciaux();
};
#endif /* defined(__annale2014__agenceLocale__) */



AgenceLocale.cpp

#include "agenceLocale.h"

AgenceLocale(string n="", Region& r, int nb = 0):this->nom(n), this->nomR(r), this->nbEmp(nb) {
    employe = new Employe();
    c = *new list<Client>();
    v = *new list<Vente>();
}

AgenceLocale(const AgenceLocale& copie) {
    this->nom = copie.nom;
    this->nomR = copie.nomR;
    this->nbEmp = copie.nbEmp;
    this->employe = copie.employe;
    this->employe = new Employe[copie.nbEmp];
    for(int i = 0; i < nbEmp; i++) {
        this->employe[i] = copie.employe[i];
    }
    c = copie.c;
    v = copie.v;
}

void addEmploye(string nom, int id) {
    Employe * e = new Employe(nom, id);
    this->employe[nbEmp] = *e;
    this->nbEmp++;
}

Vente AgenceLocale::operator[](int i) const {
    return v[i];
}

ostream& operator<<(ostream& out, Client& c) {
    for(list<Clien*> ::iterator it=lclient.begin(); it != lclient.endl();++it) {
        out << it->c.nom << endl;
    }
}

public float calculerSalaire() {
    float somme = 0.0;
    for(list<Employe*>::iterator it = lemploye.begin(); it != lemploye.end();++it) {
        somme += it->calculerSalaire();
    }
    return somme;
}

public void salaireCommerciaux() {
    float somme = 0.0;
    for(list<Commercial*>::iterator it = lcommercial.begin(); it != lcommercial.end();++it) {
        somme += it->calculerSalaire();
    }
    return somme;
}



J'espère que vous pourrez m'indiquer où je me suis trompé et pourquoi.
Je vous remercie de votre aide!
Afficher la suite 

Votre réponse

12 réponses

cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - Modifié par cptpingu le 26/02/2015 à 14:33
0
Merci
Bonjour.

Avant de commencer, je ne te cache pas que ton annal est de mauvaise qualité. Le design proposé dans l'énoncé n'est vraiment pas extraordinaire. Le code utilisé est "sale" et ne suis pas les dernières bonnes pratiques du C++ (Certaines pratiques vu dans celui-ci sont déconseillées depuis au moins 10 ans !). Bref, c'est le genre d'ouvrage sur le C++ que je déteste et qui forme de mauvais codeur C++. Il faut savoir que 90% des livres sur le C++ sont très très mauvais. Une petit partie seulement est correcte (c'est triste, mais c'est comme ça).

Je vais quand même tâcher de répondre et de te corriger.


Plusieurs soucis:
- N'utilise jamais using namespace std ! Voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- C'est "int main()" et non "void main()" (Mais d'où sort cet annal !?!)
- En C++, un attribut commence par un '_'. On net met pas this-> devant (ce n'est pas du java).
- Si un argument ne doit pas être modifié, on met "const" devant.
- Si une méthode ne modifie aucun attribut, on met un "const" à la fin de sa définition.
- On évite de mettres des arguments par défaut en mode 'nom = ""'. Ça rend la maintenance difficile, et le code dur à debugger. On préfère à la place réfléchir à un design plus jolie. Généralement, on met plusieurs constructeurs avec différents arguments ou on force l'utilisateur à bien tout remplir. J'ai choisi pour ton cas, d'obliger l'utilisateur à rentrer toutes les informations.
- Préfère std::vector au std::list (pas besoin de liste chaînée ici, un simple tableau dynamique sera plus efficace au niveau perfs). Ça s'utilise en plus pratiquement pareil.
- Pas besoin de maintenir le nombre d'employés par agence, tu as déjà cette information automatiquement via la taille du vecteur.
- Pour récupérer une agence dans le "client", préfère érire une méthode portant le nom "getAgency()" plutôt que "operateur()" qui n'est vraiment pas fait pour cela normalement. (Je sais que c'est l'exercice qui l'impose, mais c'est très moche).
- Préfère des double au float (les float ne sont pas précis)

Je te propose le code suivant (attention fait de tête, non testé):
#ifndef __annale2014__client__
#define __annale2014__client__

//#include "agenceLocale.hpp"
#include <iostream>

class Client
{
public:
  Client(const std::string& nom,
         const std::string& adresse,
         const std::AgenceLocale& agence);

  AgenceLocale operator() const;
  void afficher(std::ostream& out) const;

private:
  std::string _nom;
  std::string _adresse;
  const AgenceLocale& _agenceLocale;
};
#endif /* defined(__annale2014__client__) */

//#include "client.hpp"

Client::Client(const std::string& nom, const std::string& adresse, const AgenceLocale& al)
  : _nom(nom), _adresse(adresse), _agenceLocale(agence)
{
}

AgenceLocale
Client::operator() const
{
  return _agenceLocale->nom;
}

void afficher(std::ostream& out) const
{
  out << _nom << _adresse << *_agenceLocale;
}

#ifndef __annale2014__employe__
#define __annale2014__employe__

//#include "agenceLocale.hpp"
#include <iostream>
#include <string>

class Employe
{
public:
  Employe(const std::string& nom, int id, const Agencelocale* agl);
  virtual ~Employe();
  virtual void afficher(std::ostream& out) const;
  virtual double calculerSalaire() const = 0;

protected:
  std::string _nom;
  int _id;
  const AgenceLocale* _agl;
};
#endif /* defined(__annale2014__employe__) */

//#include "employe.hpp"

Employe::Employe(const std::string& nom, int i)
  : _nom(nom), _id(id), _agl(agl)
{
}

virtual void
Employe::afficher(std::ostream& out) const
{
  out << _nom << _id << *_agl;
}

#ifndef __annale2014__commercial__
#define __annale2014__commercial__

#include <iostream>

class Commercial : public Employe
{

public:
  Commercial(const std::string& nom, int id, double pourcentage, double fixe);
  virtual void calculerSalaire();

protected:
  double _pourcentage;
  double _fixe;
}
#endif /* defined(__annale2014__commercial__) */*

//#include "commercial.h"

Commercial::Commercial(const std::string& nom, int id, double pourcentage, double fixe)
  : Employer(nom, id), _pourcentage(pourcentage), _fixe(fixe)
{
}

double calculerSalaire() const
{
}

#ifndef __annale2014__agenceLocale__
#define __annale2014__agenceLocale__

// #include "region.h"
// #include "employe.h"
// #include "client.h"
// #include "vente.h"
#include <iostream>
#include <vector>

class AgenceLocale
{
public:
  AgenceLocale(const std::string& nom, const Region& region);
  AgenceLocale(const AgenceLocale& agence);

  void addEmploye(Employe* employe);
  Vente operator[](int i);
  void affiche(std::ostream& out);
  double calculerSalaire() const;
  double calculerSalaireCommerciaux() const;

private:
  std::string _nom;
  Region _region;
  int _nbEmp;
  std::vector<Client> _clients;
  std::vector<Vente> _ventes;
  std::vector<Employe*> _employes;
};
#endif /* defined(__annale2014__agenceLocale__) */

std::ostream& operator<<(std::ostream& out, const Client& c);


//#include "agenceLocale.h"

AgenceLocale::AgenceLocale(const std::string& nom, const Region& region, int nb)
 : _nom(nom), _region(region)
{
}

AgenceLocale::AgenceLocale(const AgenceLocale& agence)
{
  _nom = agence._nom;
  _region = agence._region;
  _clients = agence._clients;
  _employes = agence._employes;
}

void
AgenceLocale::addEmploye(Employe* employe)
{
  _employes.push_back(employe);
}

Vente
AgenceLocale::operator[](int i) const
{
  return v[i];
}

void
AgenceLocale::affiche(std::ostream& out) const
{
  for (std::vector<Client>::const_iterator it = _clients.begin(); it != _clients.endl(); ++it)
  {
    out << it->_nom << std::endl;
  }
}

std::ostream& operator<<(ostream& out, const Client& client)
{
  client.affiche(out);
  return out;
}

double
AgenceLocale::calculerSalaire() const
{
  double somme = 0.0;
  for (std::vector<Employe*>::const_iterator it = _employes.begin(); it != _employes.endl(); ++it)
  {
    somme += (*it)->calculerSalaire();
  }

  return somme;
}

double
AgenceLocale::calculerSalaireCommerciaux() const
{
  double somme = 0.0;
  for (std::vector<Employe*>::const_iterator it = _employes.begin(); it != _employes.endl(); ++it)
  {
    if (dynamic_cast<Commercial*>(*it) != 0) // Est un commercial
      somme += (*it)->calculerSalaire();
  }

  return somme;
}



N'hésite pas si tu as des questions.

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
Majestick 20 Messages postés jeudi 26 février 2015Date d'inscription 2 octobre 2015 Dernière intervention - 26 févr. 2015 à 15:19
0
Merci
Je tiens à m'excuser pour la qualité de l'annale, qui est, effectivement très passable...
Ahah voilà comment on apprend le code en université avec des profs qui ne mettent pas souvent souvent à jour leurs connaissances...
Il faudrait plus d'intervenants professionnels qui viennent nous donner des cours de langage pour être apte à bosser en entreprise pas la suite, bref.

J'avais pas fait attention au "void main" Ahah!

Toutes tes précisions sont vraiment intéressantes et j'en prends note! Ça me permet de savoir comment et quoi utiliser, merci.

Concernant les << nom="" >> dans les constructeurs, je ne te cache pas qu'ils sont définis de cette manière dans mes cours...

Je suis totalement d'accord avec toi en ce qui concerne l'utilisation de std::vector plutôt que std::list, seulement la prise d'initiative est souvent mal vu par les profs car "on contournerait" les difficultés en utilisant autre de plus simple/efficace même si on arrive au même résultat. Voilà pourquoi j'utilise des listes...

getAgency() est beaucoup, beaucoup plus clair. Mais comme tu dis, l'exercice l'impose... Ils veulent simplement voir qu'on arrive à surcharger un opérateur.
De la même manière qu'ils veulent voir si on arrive à utiliser correctement les listes.

Ton code est super, je te remercie beaucoup!
Il m'aide énormément à appuyer ce que tu as expliqué.

Sinon une question:
-Quand il y a un pointeur, vecteur ou liste dans une classe, comment ça se passe au niveau du constructeur?
Car par exemple dans AgenceLocale, il y a 3 vecteurs et on ne les retrouve pas dans le constructeur avec paramètres ni dans celui par copie. On ne les fait tout simplement pas apparaître?

Par contre je remarque que les références sont bien présentes dans les constructeurs (comme celle dans Client).

Merci encore!
Commenter la réponse de Majestick
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - Modifié par cptpingu le 26/02/2015 à 16:12
0
Merci

-Quand il y a un pointeur, vecteur ou liste dans une classe, comment ça se passe au niveau du constructeur?

C'est un oubli de ma part. Dans l'idéal tous les champs devrait être présent dans le constructeur. Sinon, ils sont dans un état indéterminé (si c'est une classe, elle utilisera son constructeur par défaut, ce n'est dangereux que pour les types POD. Raison pour laquelle je les ais omis dans le constructeur, mais je t'invite à les ajouter).

Exemple:
class Toto
{
public:
  Toto()
   : _s(), _i(), _p() // utilise la valeur par défaut du type, soit: _s(""), _i(0), _p(0) (ou _p(nullptr) si tu utilises le C++11)
 {
 }

private:
  std::string _s;
  int _i;
  int* _p;
};


Petit ajout (il y a tellement à dire que j'ai sûrement oublié d'autres choses):
std::string // std::string et non AgenceLocale, encore une petite faute de ma part
Client::operator() const
{
  return _agenceLocale->nom;
}


Je t'ai répondu "techniquement", mais ce design est horrible. On brise ici la "loi de Demeter". Cf: https://fr.wikipedia.org/wiki/Loi_de_D%C3%A9m%C3%A9ter
Pour vulgariser, on peut retourner une agenceLocale, mais pas un nom d'agence locale. Si une classe retourne plus "loin" que la sous-classe qu'elle possède, c'est moche. Dans l'idéal, on retourne une AgenceLocale, et l'utilisateur récupère le nom lui même, mais la classe Client ne fait pas le travail qui incombe à l'AgenceLocale (qui doit donner son nom elle même).

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - 26 févr. 2015 à 16:12
0
Merci
Autre oubli:
Quand on a une classe virtuelle, on écrit toujours un destructeur virtuel. D'ailleurs avec les bons flags, un compilateur t'engueulera immédiatemment. Ne pas créer de destructeur virtuel, ou l'omettre, peut provoquer des fuites mémoires. En effet, tout destructeur non virtuel ne sera pas appelés par cascades lors de la destruction. Si celui-ci devait détruire quelque chose d'important... c'est raté :(. (La remonté s'arrête au premier non virtuel, donc il faut bien que *tous* les destructeurs d'une hiérarchie virtuelle le soit).
Si ta classe n'est pas virtuelle, pas besoin d'automatiquement mettre de destructeur.

Pour les questions:

1.4) Avec le design donné, non. Car le constructeur sans argument "existe".
Avec un design propre, on aurait mis un constructeur par défaut si on en avait besoin. Mais au vu de l'énoncé, un utilisateur ne devrait pas pouvoir créer un "client" sans lui donner au moins un nom.

2.4) Toute classe possédant au moins une méthode virtuelle pure, est abstraite.
On ne peut pas instancier la classe, donc on ne peut pas utiliser son constructeur.

6) Une liste d'initialisation diffère d'une assignation dans le corps du constructeur par le fait qu'on attribut une valeur par construction à nos attributs et non par affectation. Ça permet de faire des choses normalement impossible comme:
- Donner une valeur à un attribut const
- Donner une valeur à une référence.

Exemple:
class Toto
{
public:
  Toto(const std::string& s, int& i) // Ok !
   : _s(s), _i(i)
  {
  }

  Toto(const std::string& s, int& i)
  {
     _s = s; // Erreur
     _i = i; // Erreur
  }

private:
  const std::string _s;
  int& _i;
};


7) Il n'y en a pas vraiment. C'est du sucre syntaxique. Une référence *est* un pointeur constant qui est masqué.
Ce qu'on veut sûrement que tu dise ici, c'est qu'une référence ne peut pas être nulle ni être modifiée.
(Par modifier, on entend "déplacer", tu peux bien évidemment modifier la valeur pointée ou référencée).


__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
Majestick 20 Messages postés jeudi 26 février 2015Date d'inscription 2 octobre 2015 Dernière intervention - Modifié par Majestick le 26/02/2015 à 16:28
0
Merci
C'est un oubli de ma part. Dans l'idéal tous les champs devrait être présent dans le constructeur.

D'accord pas de problème merci.

J'ai réalisé ceci pour les constructeurs d'agence locale:
agenceLocale.h
  AgenceLocale(const std::string& nom, const Region& region, int nbEmp, std::vector<Client> clients, std::vector<Vente> ventes, std::vector<Employe*> employes);
  AgenceLocale(const AgenceLocale& agence);


agenceLocale.cpp
AgenceLocale::AgenceLocale(const std::string& nom, const Region& region, int nbEmp, std::vector<Client> clients, std::vector<Vente> ventes, std::vector<Employe*> employes)
 : _nom(nom), _region(region), _nbEmp(nbEmp), _clients(clients), _ventes(ventes), _employes(employes)
{
}

AgenceLocale::AgenceLocale(const AgenceLocale& agence)
{
  _nom = agence._nom;
  _region = agence._region;
  _nbEmp = agence._nbEmp;
  _clients = agence._clients;
  _employes = agence._employes;
  _ventes = agence._ventes;
}


J'ai également entendu parler de liste d'initialisation, est-ce que c'est applicable ici?

Je connaissais pas cette règle de programmation, merci :)
Par contre quand tu parles de design horrible, tu parles du code ou de la présentation du sujet dans l'annale?
Commenter la réponse de Majestick
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - Modifié par cptpingu le 26/02/2015 à 16:36
0
Merci
J'ai réalisé ceci pour les constructeurs d'agence locale:

Oula, non. Relis mon post. Je n'ai pas dit de mettre tout en *argument* du constructeur mais *dans* le constructeur (dans la liste d'initialisation). Voir l'exemple "Toto".

_nbEmp

Cette variable ne sert à rien. std::vector comme std::list donne leur taille via ".size()".
Donc tu peux faire un: int nbEmp() const { return _employes.size(); };


J'ai également entendu parler de liste d'initialisation, est-ce que c'est applicable ici?

Oui. Cf mon post d'avant (tu as du en louper, j'en ai fait plusieurs). Je t'ai détaillé ce que c'était et ce que ça faisait.


Par contre quand tu parles de design horrible, tu parles du code ou de la présentation du sujet dans l'annale?

Je parlais du design du morceau de code qui obligeait à rompre la loi de Demeter. Plus généralement, le design général imposé par le sujet est "horrible".

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - Modifié par cptpingu le 26/02/2015 à 17:01
0
Merci
Pour plus de clarté, voici ce qu'il faudrait mettre:
AgenceLocale::AgenceLocale(const std::string& nom, const Region& region)
 : _nom(nom), _region(region), _clients(), _ventes(), _employes()
{
}

AgenceLocale::AgenceLocale(const AgenceLocale& agence)
 :   _nom(agence._nom), _region(agence._region), _clients(agence._clients),
     _ventes(agence._ventes), _employes(agence._employes)
{
}


__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
Majestick 20 Messages postés jeudi 26 février 2015Date d'inscription 2 octobre 2015 Dernière intervention - 26 févr. 2015 à 16:51
0
Merci
Oula, non. Relis mon post. Je n'ai pas dit de mettre tout en *argument* du constructeur mais *dans* le constructeur (dans la liste d'initialisation). Voir l'exemple "Toto".

Oui. Cf mon post d'avant (tu as du en louper, j'en ai fait plusieurs). Je t'ai détaillé ce que c'était et ce que ça faisait.

Ah oui j'ai complètement loupé un post! Je n'y avais pas fait attention, qui d'ailleurs répond à toutes mes interrogations merci ! :)

Donc concernant les constructeurs:
AgenceLocale(const std::string& nom, const Region& region);
AgenceLocale(const AgenceLocale& agence);

Et:
AgenceLocale::AgenceLocale(const std::string& nom, const Region& region)
 : _nom(nom), _region(region), _clients(clients), _ventes(ventes), _employes(employes)
{
}

AgenceLocale::AgenceLocale(const AgenceLocale& agence)
{
  _nom = agence._nom;
  _region = agence._region;
  _clients = agence._clients;
  _employes = agence._employes;
  _ventes = agence._ventes;
}


Je parlais du design du morceau de code qui obligeait à rompre la loi de Demeter. Plus généralement, le design général imposé par le sujet est "horrible".

D'accord d'accord :)
Commenter la réponse de Majestick
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - Modifié par cptpingu le 26/02/2015 à 17:23
0
Merci
Je te conseille de lire les posts sur la page elle même à chaque fois, et non dans ta boîte mail. Ça permet de voir tout ce qu'il s'est "passé" (notamment les éditions de posts qui ne sont pas envoyés par mail, les posts successifs, etc...).
Y a une petite erreur dans ton post ci-dessus, je t'invite à regarder mon dernier post que tu as loupé, qui corrige déjà ton erreur :p.

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
Majestick 20 Messages postés jeudi 26 février 2015Date d'inscription 2 octobre 2015 Dernière intervention - 26 févr. 2015 à 17:52
0
Merci
Effectivement, encore une fois, j'ai loupé un post qui répondait à ma question ^_^

Concernant le constructeur par copie de AgenceLocale, ne faudrait-il pas faire 3 boucles pour copier tous les employés, ventes et clients?
Commenter la réponse de Majestick
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 6 octobre 2018 Dernière intervention - Modifié par cptpingu le 26/02/2015 à 17:58
0
Merci
Concernant le constructeur par copie de AgenceLocale, ne faudrait-il pas faire 3 boucles pour copier tous les employés, ventes et clients?

Tu peux, mais sache qu'une copie de vecteur le fait déjà tout seul. (Ex: tab1 = tab2 copie déjà l'intégralité de tab2 dans tab1, élément par élément).

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
Majestick 20 Messages postés jeudi 26 février 2015Date d'inscription 2 octobre 2015 Dernière intervention - 26 févr. 2015 à 18:04
0
Merci
Tu peux, mais sache qu'une copie de vecteur le fait déjà tout seul. (Ex: tab1 = tab2 copie déjà l'intégralité de tab2 dans tab1, élément par élément).

Ok ça marche!

Je te remercie vraiment pour ton aide et le temps que tu as consacré à répondre à mes questions, cela m'a énormément apporté!
Je vais continuer à m'entraîner.
Bonne soirée :)
Commenter la réponse de Majestick

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.