Bonjour,
J'ai un membre déclaré comme suit :
char Membre[10];
Comment dois je déclarer une fonction retournant ce membre ?
Merci à tous
Version imprimable
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: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:
1
2 std::string buf = APP.GetMembre(); buf += cEnglishLanguageFileName;
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:
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.
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:
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:
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:
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...
Si on veut que la classe soit const-correcte en plus, on fait deux versions de la fonction getMembre() :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include <string> class foo { private: std::string Membre ; public: std::string & getMembre() { return Membre; } std::string const & getMembre() const { return Membre; } }; int main () { foo f ; f.getMembre() += cEnglishLanguageFileName ; //...