Erreur de compilation

Erreur de compilation - C++ - Programmation

Marsh Posté le 13-08-2003 à 17:39:48    

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 :/

Reply

Marsh Posté le 13-08-2003 à 17:39:48   

Reply

Marsh Posté le 13-08-2003 à 18:34:26    

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

Reply

Marsh Posté le 13-08-2003 à 18:52:03    

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.

Reply

Marsh Posté le 13-08-2003 à 19:35:33    

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....

Reply

Marsh Posté le 13-08-2003 à 21:45:01    

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/
Reply

Marsh Posté le 13-08-2003 à 21:51:22    

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

Reply

Marsh Posté le 13-08-2003 à 21:54:39    

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/
Reply

Marsh Posté le 13-08-2003 à 22:19:32    

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/
Reply

Marsh Posté le 13-08-2003 à 22:20:47    

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


Message édité par Taz le 13-08-2003 à 22:23:34
Reply

Marsh Posté le 13-08-2003 à 22:27:12    

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/
Reply

Marsh Posté le 13-08-2003 à 22:27:12   

Reply

Marsh Posté le 13-08-2003 à 22:32:22    

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
Reply

Marsh Posté le 13-08-2003 à 22:37:56    

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


Message édité par Taz le 13-08-2003 à 22:38:09
Reply

Marsh Posté le 13-08-2003 à 22:40:49    

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/
Reply

Marsh Posté le 13-08-2003 à 22:41:26    

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

Reply

Marsh Posté le 13-08-2003 à 22:45:07    

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/
Reply

Marsh Posté le 14-08-2003 à 09:59:26    

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.

Reply

Marsh Posté le 14-08-2003 à 10:06:20    

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.

Reply

Marsh Posté le 14-08-2003 à 10:15:45    

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!

Reply

Marsh Posté le 14-08-2003 à 11:07:56    

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
Reply

Marsh Posté le 14-08-2003 à 11:36:04    

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.).

Reply

Marsh Posté le 14-08-2003 à 11:36:45    

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.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed