Erreur de compilation - C++ - Programmation
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
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.
Marsh Posté le 13-08-2003 à 19:35:33
Je crois que tu as mal lu ton cours
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....
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.
Marsh Posté le 13-08-2003 à 21:51:22
amis du C bonsoir. des printf, des pointeurs, pas d'encapsulation ... je déplace?
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?
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 :
|
Ca compile mais est-ce que ça fonctionne...? A priori je ne vois comment une conversion de (Base*) vers (Derivee*) pourrait poser un pb...
Marsh Posté le 13-08-2003 à 22:20:47
les cast C, c'est mal (surtout surtout ici)
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"...
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 :
|
Marsh Posté le 13-08-2003 à 22:37:56
alors ils sont où les / ?
Marsh Posté le 13-08-2003 à 22:40:49
Ouais, c'est blindé, mais
Code :
|
ç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.
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.
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.
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.
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!
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.
|
Bon ben merci a tous, je viens d'apprendre kkchose
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 ? (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 ?)
2-Je ne SAIS pas comment bien structurer un programme mais je voudrais vraiment apprendre
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
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 (le gars m'a dit "Vite il reste que pe de tps, fais la methode VITE maintenant) dc je dois tracer
Merci a tous
Marsh Posté le 14-08-2003 à 11:36:04
giz a écrit : |
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 :
|
conjurent toute espèce d'ambiguïté (y compris si un x homonyme est redéclaré, etc.).
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.
Marsh Posté le 13-08-2003 à 17:39:48
Je dispose d'1 membre protege dans une classe de base fichier CShared_buffer.h)
soit la classe derivee suivante (CFile.h):
definition de la fonction dans CFile.cpp :
la ligne en gras provoque l'erreur suivante a la compilation :
aidez moi
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