Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2961 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Erreur de compilation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur de compilation

n°486181
Giz
Posté le 13-08-2003 à 17:39:48  profilanswer
 

Je dispose d'1 membre protege dans une classe de base :(fichier CShared_buffer.h)
 

Code :
  1. typedef struct _DataBuffer
  2. {
  3. unsigned long *bufAddr;
  4. int bufSize;
  5. const char *bufName;
  6. }DataBuffer;
  7. class CShared_buffer
  8. {
  9. private:...
  10. public:...
  11. protected:
  12. DataBuffer buffer;
  13. };


 
soit la classe derivee suivante (CFile.h):  
 

Code :
  1. #include "CShared_buffer.h"
  2. class CFile : public CShared_buffer
  3. {
  4. private: ...
  5. public :
  6. void WriteLogFile(CShared_buffer *bufToWrite);
  7. };


 
 
definition de la fonction dans CFile.cpp :
 

Code :
  1. void CFile::WriteLogFile(CShared_buffer *bufToWrite)
  2. {
  3. SYSTEMTIME a_date;
  4. /* switch according to the first letter */
  5. if (nb_data_columns) {
  6. for (int i = 0; i < (bufToWrite->buffer).bufSize; i++) {
  7. GetSystemTime(&a_date);
  8. fprintf(f, "%ld:%ld:%ld:%ld\t", a_date.wHour, a_date.wMinute, a_date.wSecond, a_date.wMilliseconds);
  9. for (int j = 0; j < nb_data_columns; j++)
  10. fprintf(f, "%ld\t", (bufToWrite->buffer).bufAddr[j]);
  11. fprintf(f, "\n" );
  12. }
  13. }
  14. /* It is in the destructor */
  15. //fclose(f);
  16. }


 
la ligne en gras provoque l'erreur suivante a la compilation :

Code :
  1. d:\amap2\sources\cfile.cpp(62) : error C2248: 'buffer' : cannot access protected member declared in class 'CShared_buffer'


 
aidez moi  :sweat:  
PS : ne me dites pas d'allez voir les cours, je suis passer sous google et le cours http://www.ann.jussieu.fr/courscpp [...] 08-B0.html dit que mon erreur ne devrait pas avoir lieu :/

mood
Publicité
Posté le 13-08-2003 à 17:39:48  profilanswer
 

n°486226
Giz
Posté le 13-08-2003 à 18:34:26  profilanswer
 

je galere je galere je galere ! tous les cours du net me disent que c bon mon truc  :cry:  :cry:  :cry:

n°486232
Vko
- Le roi des patates -
Posté le 13-08-2003 à 18:52:03  profilanswer
 

a priori ca me semble correct.
 
vu que le membre est en protected j'vois pas ce qui cloche.
 
Pour tester, met le en public et recompile.

n°486257
Willyzekid
Posté le 13-08-2003 à 19:35:33  profilanswer
 

Je crois que tu as mal lu ton cours :D
 
Tu peux pas accéder à un membre protected (ici buffer) de l'exterieur...Et avec ton bufToWrite->buffer, ben, c'est exactement ce que tu fais!!!
 
Oriente toi vers le mot clef friend ou surtout, revois la structure de ton prg! Peut être que le WriteLogFile() devrait etre appelé par le bufToWrite que tu lui passe??? 'nfin bref, la structure de ton prg, ca me parait n'importe quoi....

n°486405
ACut
Posté le 13-08-2003 à 21:45:01  profilanswer
 

Je crois que c'est la notion <<extérieur à la classe>> qui pose un pb à Giz. Vu que bufToWrite->buffer est invoqué DANS le corps d'une méthode de la classe dérivée, il considère que c'est un accès "intérieur" au membre protégé, et donc ça le scandalise que le compilateur lui refuse cet accès.
 
Moi qui suis assez profane aussi en POO, j'ai du mal à déjouer facilement ce type de trompe-l'oeil et je comprends la réaction de Giz.


---------------
NOUVEAU! Le guide de l'édition en version ebook : http://marcautret.free.fr/autret/150q-ebook/
n°486415
Taz
bisounours-codeur
Posté le 13-08-2003 à 21:51:22  profilanswer
 

amis du C bonsoir. des printf, des pointeurs, pas d'encapsulation ... je déplace?

n°486420
ACut
Posté le 13-08-2003 à 21:54:39  profilanswer
 

Taz a écrit :

amis du C bonsoir. des printf, des pointeurs, pas d'encapsulation ... je déplace?


 
Pas compris. On parle d'accès aux membres protégés, c'est mal?


Message édité par ACut le 13-08-2003 à 22:20:18

---------------
NOUVEAU! Le guide de l'édition en version ebook : http://marcautret.free.fr/autret/150q-ebook/
n°486475
ACut
Posté le 13-08-2003 à 22:19:32  profilanswer
 

Pour info, un transtypage de bufToWrite vers le type CFile* (=pointeur sur classe dérivée) offre p-ê une piste. En effet, le code suivant se compile:
 

Code :
  1. class Base
  2. {
  3. protected:
  4. int     x;
  5. };
  6. class Derivee : public Base
  7. {
  8. void    Test(Base* pBase)
  9.         {
  10.         Derivee* clone;
  11.         clone = (Derivee*) pBase;
  12.         x = clone->x; // alors que pBase->x aurait été rejeté
  13.         }
  14. };


 
Ca compile mais est-ce que ça fonctionne...? A priori je ne vois comment une conversion de (Base*) vers (Derivee*) pourrait poser un pb...


---------------
NOUVEAU! Le guide de l'édition en version ebook : http://marcautret.free.fr/autret/150q-ebook/
n°486478
Taz
bisounours-codeur
Posté le 13-08-2003 à 22:20:47  profilanswer
 

les cast C, c'est mal (surtout surtout ici)


Message édité par Taz le 13-08-2003 à 22:23:34
n°486487
ACut
Posté le 13-08-2003 à 22:27:12  profilanswer
 

Je sais que c'est pas orthodoxe, mais je tâtonne, là. Je le trouve intéressant ce pb, pour moi c'est pédagogique.
 
Et entre nous, je ne trouve pas beaucoup plus séduisante la solution consistant à passer par des "friend"...


---------------
NOUVEAU! Le guide de l'édition en version ebook : http://marcautret.free.fr/autret/150q-ebook/
mood
Publicité
Posté le 13-08-2003 à 22:27:12  profilanswer
 

n°486498
Taz
bisounours-codeur
Posté le 13-08-2003 à 22:32:22  profilanswer
 

il me semble qu'en fait Base est bien la base, mais ça ne donne pas de droit comme friend.
 
la solution:
 

Code :
  1. class Foo
  2. {
  3. public:
  4.   virtual ~Foo()
  5.   {}
  6. protected:
  7.   int x;
  8. };
  9. class Bar
  10. : public Foo
  11. {
  12.   void f(Foo *b)
  13.     {
  14.       Bar *other=dynamic_cast<Bar*>(b);
  15.       if(other)
  16. {
  17.   this->x = other->x;
  18.   Foo::x =  other->Foo::x;
  19. }
  20.     }
  21. };


Message édité par Taz le 13-08-2003 à 22:32:29
n°486512
Taz
bisounours-codeur
Posté le 13-08-2003 à 22:37:56  profilanswer
 

alors ils sont où les [:prosterne] / [:roi] ?


Message édité par Taz le 13-08-2003 à 22:38:09
n°486521
ACut
Posté le 13-08-2003 à 22:40:49  profilanswer
 

Ouais, c'est blindé, mais

Code :
  1. Bar *other=dynamic_cast<Bar*>(b);


ça reconsomme de l'allocation mémoire, non?
 
Ca me fait pas bander ton truc, sauf ton respect. Giz cherche certainement une solution plus naturelle à son pb.


---------------
NOUVEAU! Le guide de l'édition en version ebook : http://marcautret.free.fr/autret/150q-ebook/
n°486522
Taz
bisounours-codeur
Posté le 13-08-2003 à 22:41:26  profilanswer
 

1) non
2) c'est la solution la plus naturelle

n°486528
ACut
Posté le 13-08-2003 à 22:45:07  profilanswer
 

Je me suis rendu compte que ça "reconsommait" pas après avoir posté!! Pff, et voilà je suis grillé comme un newb!
 
Bon, ben, il ne me reste plus qu'à te présenter toutes mes génuflexions les plus sincères.


---------------
NOUVEAU! Le guide de l'édition en version ebook : http://marcautret.free.fr/autret/150q-ebook/
n°486843
Vko
- Le roi des patates -
Posté le 14-08-2003 à 09:59:26  profilanswer
 

Précision ... le dynamic_cast est plus lent qu'un "bon petit vieux cast C" car il y a un "data type check", alors que le cast c est totalement bourrin et dénué d'intelligence.
 
mais c'est sûr que c'est plus propres.

n°486859
Taz
bisounours-codeur
Posté le 14-08-2003 à 10:06:20  profilanswer
 

plus lent, vous avez que ça comme mot à la bouche... si je jetais un oeil a vos codes, moi je vous en trouve de l'optimisation et de la belle!
 
le dynamic_cast il est sur et efficace. surtout que si le type peut etre déterminer au moment de la compilation, ça a le meme effet qu'un static_cast. donc flipper pas betement. le dynamic_cast etst pas plus propre, c'estla seule manière de procéder. si quelqu'un a une autre solution pour savoir si on est en présence d'un objet apparenté à tel type, je demande à voir. le cast C ici serait un bug très très grave aux conséquences difficiles.

n°486873
Willyzekid
Posté le 14-08-2003 à 10:15:45  profilanswer
 

Willyzekid a écrit :

Peut être que le WriteLogFile() devrait etre appelé par le bufToWrite que tu lui passe??? 'nfin bref, la structure de ton prg, ca me parait n'importe quoi....


 
Je persiste et signe! Cette fonction WriteLogFile() est ridicule...A aucun moment dans l'implémentation tu ne fais référence à un membre de la classe appellante. Cette fonction pourrait très bien ne pas faire partie de la classe! Ou elle pourrait être appellé par la classe que tu lui passe en paramètre, tout simplement!
 
C'est l'architecture qui est à revoir!

n°486934
Giz
Posté le 14-08-2003 à 11:07:56  profilanswer
 

Taz a écrit :

il me semble qu'en fait Base est bien la base, mais ça ne donne pas de droit comme friend.
 
la solution:
 

Code :
  1. class Foo
  2. {
  3. public:
  4.   virtual ~Foo()
  5.   {}
  6. protected:
  7.   int x;
  8. };
  9. class Bar
  10. : public Foo
  11. {
  12.   void f(Foo *b)
  13.     {
  14.       Bar *other=dynamic_cast<Bar*>(b);
  15.       if(other)
  16. {
  17.   this->x = other->x;
  18.   Foo::x =  other->Foo::x;
  19. }
  20.     }
  21. };




 
Bon ben merci a tous, je viens d'apprendre kkchose  :hello:  
Sachez que les cours sont CARRES malheuresement c a dire qu'il ne se limite qu'a des cas simple clair et precis (autrement dit neuneu). Je vois difficilement comment j'aurais pu savoir ce pb sans votre aide :/
 
Taz :
1-Je vois pas trop la difference avec le code de ACut
2-qu'est ce que tu appeles un "dynamic cast" (par rapport a un "static cast" )
3-La ligne en gras, le this->x ... ca reviens a mon erreur non ?  :sweat: (tu accedes indirectement au membre protege)
 
Willyzekid :
1-Je veux bien admettre que ma structure est incoherente (pourtant ds ma fonction WriteLogFile, j'ai un appel a la classe de base dc c peut etre pas completement debile non ?:/) :cry:  
2-Je ne SAIS pas comment bien structurer un programme mais je voudrais vraiment apprendre  :cry:  
3-Je ne rentre qu'en license...bref je pense avoir beaucoup a apprendre encore, d'autant plus que la conception de prog ca touche a l'uml je pense...
4-Si tu trouves cette fonction mal placee, me conseille tu de detruire ma classe et de faire un bon ptit fichier (comme j'ai deja commence) "fonctions.cpp" ou j'y met toutes mes fonctions independantes ?
5-Je voulais faire une sorte d'encapsulation/structuration, car avec les classe on s'y retrouve bien mieux  [:spamafote]  
6-c que mon 2eme stage, aucun programmeur ou je bosse, je dois me demerder, eux, ils attendent un resultat, kkchose qui marche. Ils s'en branlent de l'optimisation/beaute du code, il regarde que le resultat  [:spamafote] (le gars m'a dit "Vite il reste que pe de tps, fais la methode VITE maintenant) dc je dois tracer :/
 
Merci a tous  :jap:


Message édité par Giz le 14-08-2003 à 11:17:42
n°486978
ACut
Posté le 14-08-2003 à 11:36:04  profilanswer
 

giz a écrit :


 
1-Je vois pas trop la difference avec le code de ACut
2-qu'est ce que tu appeles un "dynamic cast" (par rapport a un "static cast" )
3-La ligne en gras, le this->x ... ca reviens a mon erreur non ?  :sweat: (tu accedes indirectement au membre protege)
 


 
1) Y a une différence majeure: celui de Taz est blindé
 
2) dynamic vs static cast: ça peut pas ne pas être dans ton cours (même s'il est lapidaire)
 
3) this->x ne revient pas à ton erreur, car this est de type (Derivee*) -- par la force des choses!! -- et non de type (Base*)
En fait, les deux lignes:

Code :
  1. this->x = other->x;
  2. Foo::x =  other->Foo::x;


conjurent toute espèce d'ambiguïté (y compris si un x homonyme est redéclaré, etc.).

n°486982
Taz
bisounours-codeur
Posté le 14-08-2003 à 11:36:45  profilanswer
 

1) 2) tout est dans le cast. à toi de te trouver un cours. là je taffe, j'ai pas le temps de le faire. le code de Acut est mauvais et buggé
3) voir mon message précédent. protected != friend. tu hérites d'une classe mais ça ne te rends pas ami avec elle.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Erreur de compilation

 

Sujets relatifs
VB6: Erreur de compilation incompréhensible....pour moiErreur lors de la compilation sous borland....
erreur de compilationProblème GCC : pas d'éxécutable, ni d'erreur en fin de compilation
Erreur de compilation avec un makefile[C] message d erreur a la compilation (linking)
Erreur de compilation / comment on appelle une methode d'une class?[JAVA] erreur de compilation que je capte pas ... [resolu]
Erreur de compilation AIDE SVP[c++] Erreur incomprehensible a la compilation: help me!
Plus de sujets relatifs à : Erreur de compilation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR