Bonjour,
J'ai un membre déclaré comme suit :
char Membre[10];
Comment dois je déclarer une fonction retournant ce membre ?
Merci à tous
Bonjour,
J'ai un membre déclaré comme suit :
char Membre[10];
Comment dois je déclarer une fonction retournant ce membre ?
Merci à tous
Pour ne pas pouvoir le modifier à l'extérieur de ta classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part const char* getMembre() const;
Merci et que dois je mettre après le return de getMembre() ?
Membre évidemment ... Pffff
Le problème que je rencontre après est que je dois utiliser la valeur retounée dans strcat et le compilateur me dit :
cannot convert parameter 1 from 'const char *' to 'char *'
dans l'instruction :
strcat(APP.GetMembre(),cEnglishLanguageFileName)
Normal, tu es entrain d'essayer de modifier (avec strcat()) un pointeur dont le contenu est constant.
Une solution (peut être) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 std::string buf = APP.GetMembre(); buf += cEnglishLanguageFileName;
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
Et c'est bien...
Si tu permet à une fonction externe de modifier une variable membre de ta classe, tu violes un principe fondamentale de la POO : l'encapsulation.
Bien sur, il suffirait que tu enlèves les const de la fonction GetMembre() pour résoude ton pb de compile et prier pour que cEnglishLanguageFileName ne dépasse jamais 10 caractères...
Si tu me permets un conseil :
1. Fais un membre de type std::string, qui est plus flexible qu'un buffer de char.
2. Fais un SetMembre() qui met à jour, avec tout les contrôles nécessaire ta variable membre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void SetMembre(const std::string& val) { membre = val; }
Hou la la ! Ca sent le core dump à plein nez ton histoire...
Si tu écris çaBien sûr ça va marcher, mais cette implémentation masque completement le fait que Membre ne fait que 10 caractères. Or le strcat n'a aucun moyen de vérifier que tu ne dépasses pas ces 10 caractères !
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 #include <string.h> class foo { private: char Membre[10]; public: char* getMembre() { return( Membre ) ;} }; int main () { foo f ; strcat( f.getMembre(), cEnglishLanguageFileName ) ; //...
Donc, tôt ou tard, ta cEnglishLanguageFileName fera + de 10 caractères et ce sera le core dump.
Tu as la chance de travailler avec un langage qui est un pur bijoux, alors sers-t-en !
Comme le dit ram-0000, utilise les std::string !
Tu verras, c'est que du bonheur...
Ce code est encore très discutable, mais au moins il est fiable.
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 #include <string> class foo { private: std::string Membre ; public: std::string & getMembre() { return( Membre ) ;} }; int main () { foo f ; f.getMembre() += cEnglishLanguageFileName ; //...
Et puis tu arrêtes de d'emm... avec la bibliothèque string.h qui demande une certaine habitude...
[EDIT] argl ! j'ai été coiffé au poteau par Grulim...
Bonjour,
J'aurais tendance à faire plutôt comme ça :
Mais pour être franc, j'aurais carrément tendance à ne pas utiliser char[10] ni en membre ni en retour de fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 struct A { typedef char type_membre[10]; type_membre membre; type_membre const & get_membre_1(); };
-> std::string s'il s'agit de modéliser une chaîne de caractère
-> std::vector<char> s'il s'agit d'un vecteur dynamique
-> boost::array<char,10> ou std::tr1::array<char,10> s'il s'agit d'un vecteur de taille déterminée à la compilation.
Et in fine, utiliser le type unsigned char et non char s'il s'agit de manipuler des octets.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Partager