|
FAQ C++ (Foire Aux Questions) |
virtual
et le passage par référence !
Animal::SeReproduire()
ne
fonctionne pas alors que le mot clé virtual est correctement
utilisé, et que le parametre de l'objet à "virtualiser"
de la fonction Veterinaire() est bien passée par référence !
SeReproduire() en SeReproduire()
const dans les méthodes filles comme ça l'est dans la méthode
mère.
void Veterinaire(const Animal& aml) {
cerr << "\nFonction Veterinaire\n\t";
aml.Ecrit_Animal();
aml.SeReproduire();
return;
}
Or, on avait dans la classe mère Animal :
virtual void SeReproduire() const {...}
Le mot clé const indique que la méthode SeReproduire()
ne modifie pas l'objet propriétaire de cette méthode.
Mais dans les classes filles Poule et Chien on avait
(re)défini :
virtual void SeReproduire() {...}
Or Les méthodes SeReproduire() des classes Chien et
Poule ne sont pas suivies de const.
SeReproduire() const de la classe mère
Animal
que l'on avait souhaité redéfinir : par erreur on effectué
une surcharge au lieu d'une redéfinition !
Or la fonction global Veterinaire déclare son
parametre Animal comme const, et n'a donc
pas le droit de le modifier. Veterinaire ne peut donc utiliser
QUE des méthodes qui ne modifie pas l'objet
aml de la classe Animal.
Elle cherche
donc à appeler la méthode SeReproduire() const {...}
des méthodes filles qui n'existe pas !
Et c'est finalement la
méthode SeReproduire() de la classe mère qui est
réellement appelée interdisant ainsi le fonctionnement de la
virtualité (car il n'y a pas de choix possible).
Retour sommaire
#include <strstream.h>
#include <iostream.h>
#include <string>
// Déclaration du flot de sortie (non lié à un fichier)
ostrstream myStream ;
// Remplissage du flot de sortie (utiliser ends)
myStream << " -> "
<< pourcent
<< "%"
<< " en "
<< mn
<< "mn"
<< ends;
// Conversion du flot de sortie en tableau de caractère,
// et figeage de ce flot
char* str = myStream.str();
// Exploitation du tableau de caractere
s.print_result("Fin: ", str);
// NE PAS OUBLIER de libérer le tableau
delete str;
Retour sommaire
#include <strstream.h>
#include <iostream.h>
#include <string>
// Des données brutes sont définie dans une sorte de "
// "constante" dans un flot mémoire.
// Ce prototype peut tres facilement être modifié pour
// lire ces données depuis un fichier d'entrée
strstream myStream;
myStream
<< "P1 0 0 \n"
<< "P2 0 3 \n"
<< "P3 1 1 \n" \\ imaginer 30 lignes similaires
<< ends ;
string s1;
int x;
int y;
myStream >> s1 >> x >> y;
// on pourrait ici créer les objets points
cout << "s1=" << s1 << " x=" << x << " y=" << y << endl;;
string name;
name = myStream.str();
cout << "name=" << name << endl;
exécution : affichage de :
s1=P1 x=0 y=0
name=P1 0 0
P2 0 3
P3 1 1
Retour sommaire
// pour le "cout"
#include <iostream>
// déf. des fonctions rand() and srand() et de RAND_MAX
#include <stdlib.h>
// définition de la fonctions time()
#include <time.h>
int main() {
int randInt;
float randFloat;
// initialisation de générateur à partir de l'heure courante
srand(time(NULL));
for (int i = 1; i <= 10; ++i) {
// rand() génère un entier de 0 à RAND_MAX
randInt = rand();
randFloat = float (randInt) / RAND_MAX ;
cout << "randInt=" << randInt
<< " "
<< "randFloat=" << randFloat
<< endl;
};
return 0;
}
Retour sommaire