débutant : question technique sur transtypage
Bonjour,
je suis débutant et ai écrit le programme suivant (j'ai laissé les parties de code qui nous intéressent) :
Code:
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
| #include <cstdlib>
#include <iostream>
#include <string.h>
using namespace std;
/****************** class chaine ****************
*************************************************/
class chaine
{
public:
chaine(const char* _val);
private:
int longueur;
char* val;
};
chaine::chaine(const char* _val)
{
longueur=strlen(_val);
val=new char[longueur+1];
strcpy(val,_val);
}
/********************* class pile-chaine **************
*******************************************************/
class pile_chaine
{
public:
int empiler(const chaine& chn);
pile_chaine& operator=(const pile_chaine& op2);
private:
int max;
enum pile_etat{ok,plein,vide};
chaine* table;
int nb_elem;
pile_etat etat;
};
int pile_chaine::empiler(const chaine& chn)
{}
int main(int argc, char *argv[])
{
pile_chaine tab_chaine(5);
tab_chaine.empiler("test1");
system("PAUSE");
return EXIT_SUCCESS;
} |
Ce programme accepte le transtypage dans le programme principal, c'est à dire que "tab_chaine.empiler("test1") fonctionne et l'argument formel "const chaine& chn" de "int pile_chaine::empiler" s'initialise grace au constructeur de transtypage défini au début.
J'ai essayé avec une modification suivante (je note ici uniquement les lignes où j'ai changé quelque chose) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class pile_chaine
{
public:
int empiler(chaine& chn);
private:
..........
};
int pile_chaine::empiler(chaine& chn)
{}
int main(int argc, char *argv[])
{
pile_chaine tab_chaine(5);
tab_chaine.empiler("test1");
.............
} |
le seul changement que j'ai fait est de remplacer l'argument constant formel ("const chaine& chn") de "int pile_chaine::empiler" en un argument non constant ("chaine& chn") et à la compilation j'ai l'erreur suivante :
Code:
1 2
| 169 C:\Dev-Cpp\programme1-main.cpp no matching function for call to `pile_chaine::empiler(const char[6])'
note C:\Dev-Cpp\programme1-main.cpp:114 candidates are: int pile_chaine::empiler(chaine&) |
Est-ce que quelqu'un peut m'expliquer pourquoi le transtypage ne fonctionne plus. Merci d'avance.
Xavier
réponse : (débutant : question technique sur le transtypage)
Merci LAURENT et MAT,
je saisis mieux ce que vous voulez dire. je considère que c'est résolu.:D
Une précision concernant MAT :
Citation:
void f( std::string& ) {}
int main( int, char*[] )
{
f( std::string() );
return 0;
}
Dans cet exemple que tu me donnes, "std::string&" représente t-il bien une référence sur une chaine de caractère (je n'ai pas le standard C++, mais je crois que string désigne une chaine dans le standard). Et est-ce que "std::string()" représente l'appel d'une fonction (qui renverrai une référence sur une chaine de caractère) ?
Si j'ai bien saisi "std::string()" renverrai une référence sur une chaine de caractère qui n'est pas nommée, donc "à la volée". Ceci nécessite donc qu'on déclare l'argument "const std::string&" dans f. Est-ce que j'ai bien saisi ?
Question pour LAURENT et MAT : j'ai 2 ouvrages de C++ : 1 assez concis et 1 de 1200 pages. Je croyais que ce dernier était complet, mais je me suis apperçu qu'il manquait des choses (par exemple il n'y a rien sur les types string qui désignerait des chaines de caractère dans le standard ou il n'y a rien des explications que vous m'avez donné pour mon problème de cette discussion). Ma question est la suivante : connaissez vous un ouvrage (en français si possible) très très complet qui reprenne le standard du C++ et qui aborde le maximum des spécificités du C++ et qui soit de bonne qualité pour les explications (avec exercices corrigés si possible)?
Merci de votre réponse. A bientôt.
réponse (débutant : question technique sur le transtypage)
Merci LAURENT, MAT et LUC de vos explications et interventions.
Xavier:D