Bonjour...
Je suis tout nouveau ici; en train d'apprendre tout seul le C++, hou la galère mais ça me botte.
N'ai pas osé aussi posé mes questions ici: vous me semblez déjà si forts; alors,
Bon, mon pb: j'en suis à Classes et héritage et me servir d'un tableau de pointeurs
et le projet que je monte au fur et à mesure de la leçon, là, il coince; et plus j'essaye de le corriger, moins je comprends...
Je vais vous passer le main.cpp et les fichiers de la classe-mère; ce doit être suffisant pour que vous releviez mes énormités.... :

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
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <string>  
# include <vector> 
#include "Vehicule.h"
#include "Voiture.h"
#include "Moto.h"
#include "Camion.h"
 
using namespace std;
 
int main()
{
  /* je crée un tableau dynamique de véhicules où je mettrai tous les véhicules dont je dispose en ces trois classes-filles: voitures, motos, camions: */
    vector<Vehicule*> listeVehicules;
// je mets mes véhicules:
  listeVehicules.push_back (new Voiture(12500,4,2002,150,"Land-Rover", " Tout-terrain ",3, "bleu-nuit"));
  /* A) ci-dessus => erreur: no matching function for call to 'Voiture::Voiture
  (int,int,int,int, const char [11], const char [15], int, const char[10])'
  listeVehicules.push_back (new Voiture(6000,4,2005, 150,"New-Beetle","cabriolet",2, "bleu-nuit,"));
  // même erreur que A)
  listeVehicules.push_back (new Voiture(35000,5,200,2006,"Range-Rover","Premium",5,"blanc"));
  // même erreur A)
  // et rajouter pour les motos la valeur de m_cylindree()
  listeVehicules.push_back (new Moto(1100,2,2010,95,"Kawasaki",125));
  /* erreur A'): idem que A mais avec call to 'Moto::Moto(... plus qu'il dit:
  candidate expects 0 argument, 6 provided */
  listeVehicules.push_back (new Moto(10000,2,2004,150,"Harley-Davidson",2400));
  // erreur A')
  // et rajouter pour les camions int m_tonnage
  listeVehicules.push_back (new Camion(3000,4,2000,130,"Combi-VW",2));
  /* ereur A": idem que A) mais avec call to 'Camion::Camion... plus qu'il dit:
  candidate expects 0 argument, 6 provided... ah bon, il en attend 0? */
  listeVehicules.push_back (new Camion(50000,12,2001,145,"Mercedes",18));
  // erreur A")
 
  // une fois la collection définie, le job par lui-même: 
  int choix(0);
    cout << "Que souhaitez-vous ?" << endl;
    cout << "1. Une moto" << endl;
    cout << "2. Une voiture" << endl;
    cout << "3. Un camion" << endl;
 
    cin >> choix;
 
    switch(choix)
       {
        case 1:
          // Moto
            {
             // le proto de la méthode affiche est dans Vehicule.h en virtual
             (listeVehicules[4])-> affiche(); /* utilisation de la fonction
              * affiche() pour le pointeur de la case 4 qui doit correspondre à la Harley */
            }
          break;
 
      case 2:
          // Voiture
          {
           (listeVehicules[1])->affiche(); // pour la Beetle
          }
          break;
 
      case 3:
          // Camion
          {
           (listeVehicules[6])->affiche(); // le camion Mercedes
          }
          break;
 
      default:
          cout << "Entrée invalide" << endl;
          break;
  }
 
  for (int i(0); i<listeVehicules.size(); ++i) /* attention: comparaison entre
    des expressions entières signée et non signée: ça veut dire quoi, ça ??? */
  {
    delete listeVehicules[i]; 
    /* attention: deleting object of polymorphic class type 'Vehicule' which has
    non virtual-destructor might cause undefined behaviour */
    listeVehicules[i] = 0; // on met le pointeur à zéro
  }
 
  return 0;
}
Maintenant le fichier Vehicule.h:

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
#ifndef VEHICULE_H_INCLUDED
#define VEHICULE_H_INCLUDED
 
class Vehicule 
{
  public: 
  Vehicule();
 // ci-dessus est le prototype du constructeur d'objets par défaut:
  ~Vehicule(); // le destructeur
  // prototype de la méthode affiche:
  virtual void affiche() const; // description du véhicule
 
  protected: 
    int m_prix; // chaque véhicule a un prix
    int m_nbRoues;
    int m_annee;
    int m_vitesse;
    std::string m_marque;
    // ces attributs déclarés ici seront initialisés par le constructeur
}; 
 
#endif // VEHICULE_H_INCLUDED
puis le fichier-source: Vehicule.cpp

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
#include <iostream> 
#include "Vehicule.h"
 
using namespace std;
  // déclarer les variables avec lesquelles seront initialisées les attributs:
  int prix(1000), nbRoues(4), annee(1943), vitesse(200);
  string marque("Panhard") ;
// ci-dessous le constructeur suivi de sa liste d'initialisations:
Vehicule::Vehicule():
 m_prix(prix), m_nbRoues(nbRoues), m_annee(annee), m_vitesse(vitesse),m_marque(marque)
{
} 
// après le constructeur, le destructeur:
Vehicule::~Vehicule()
{
}
// implémentation de la fonction affiche de la classe Vehicule:
void Vehicule::affiche() const
{
  cout << "Je suis ce que vous cherchez, pour  " << m_prix << " euros" << endl;
  cout << un(e) << m_marque <<  " de : " << m_annee << endl;
}
Les fichiers headers et source des autres classes sont du même acabit; si vous en avez besoin, je les rajouterai.
Bon, je me doute que j'ai dû commettre quelques crimes... faut dire qu'à chercher où est l'erreur, je comprends de moins en moins ce que je fais...