3.2.6 Une première utilisation

Il faut d'abord nous créer un dossier build :

mkdir build

Ensuite on entre dedans :

cd build

On appel CMake :

cmake ..
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done

On appel make :

make
Scanning dependencies of target crustace
[ 33%] Building CXX object CMakeFiles/crustace.dir/crustace.cpp.o
[ 66%] Building CXX object CMakeFiles/crustace.dir/crevette.cpp.o
[100%] Building CXX object CMakeFiles/crustace.dir/main.cpp.o 
Linking CXX executable crustace             
[100%] Built target crustace

Et lance le programme :

./crustace 
constructeur de Crustace
 je m’appelle crustacé
destructeur de crevette
destructeur de Crustace

Il n'y a pas d'appel au constructeur de Crevette car on ne l'a pas définit (on s'est servit de l'héritage).

Mais c'est nul, on a pas donné de nom à la Crevette.

Et bien faisons le.

Voici ne nouveaux fichier main.cpp :

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include "crustace.h"
#include "crevette.h"


int main(int argc, char** argv){
	Crevette crevette("Bond");
	
	crevette.parler();
	
	
	return 0;
}

Compilons avec make :

make
Scanning dependencies of target crustace
[ 33%] Building CXX object CMakeFiles/crustace.dir/main.cpp.o
main.cpp: In function ‘int main(int, char**)’:                                           
main.cpp:8:26: erreur: no matching function for call to ‘Crevette::Crevette(const char [5])’
main.cpp:8:26: note: candidates are:
crevette.h:10:7: note: Crevette::Crevette()
crevette.h:10:7: note:   candidate expects 0 arguments, 1 provided
crevette.h:10:7: note: Crevette::Crevette(const Crevette&)
crevette.h:10:7: note:   no known conversion for argument 1 from ‘const char [5]’ to ‘const Crevette&
make[2]: *** [CMakeFiles/crustace.dir/main.cpp.o] Erreur 1
make[1]: *** [CMakeFiles/crustace.dir/all] Erreur 2
make: *** [all] Erreur 2

Arg, au secours ça ne marche pas.

Bon, regardons de que nous dit le compilateur (je vous ai enlever les chemins vers le fichiers pour que l'on puisse y voir quelque chose).

Voici la ligne qui nous intéresse :

main.cpp:8:26: erreur: no matching function for call to ‘Crevette::Crevette(const char [5])’

Il nous dit qu'il ne connaît pas de constructeur prenant une chaîne de caractère comme argument.

Mais il est définit ce constructeur dans crustace.h.

Oui, mais l'héritage du constructeur ne concerne que le constructeur par défaut (qui ne prend pas de paramètre dans notre cas).

Car ce constructeur :

1
Crustace(const std::string & nom = "crustacé");

Équivaux à ces deux là :

1
2
Crustace();
Crustace(const std::string & nom);

Avec un nom par défaut donner au constructeur sans paramètre.

Donc, lorsque Crevette hérite de Crustace, elle n'hérite que du constructeur par défaut. Mais nous allons remédier à cela.

Nous allons écrire le même constructeur pour Crevette que celui de Crustace.

D'abord le prototype (crevette.h) :

1
Crevette(const std::string & nom = "crevette");

Et voici l’implémentation (crevette.cpp) :

1
2
3
4
5
Crevette::Crevette(const std::string & nom)
	:Crustace(nom)
{
	cout << "constructeur de crevette" << endl;
}

L'appel :Crustace(nom) juste après le nom de la fonction est un appel au constructeur de Crustace. En effet une Crevette ne sait pas comment se construit un Crustace elle doit donc appeler le constructeur de Crustace pour se construire complètement.

Nous pouvons maintenant recompiler le tout :

make
Scanning dependencies of target crustace
[ 33%] Building CXX object CMakeFiles/crustace.dir/crevette.cpp.o
[ 66%] Building CXX object CMakeFiles/crustace.dir/main.cpp.o
Linking CXX executable crustace
[100%] Built target crustace

Et exécuter le programme :

./crustace 
constructeur de Crustace
 je m’appelle Bond
destructeur de crevette
destructeur de Crustace

Voilà, notre Crevette à le bon nom.