[débutant C++] accès aux membres privés

accès aux membres privés [débutant C++] - C++ - Programmation

Marsh Posté le 29-05-2006 à 12:42:30    

Bonjour,
 
Je suis surpris qu'à l'exécution du code suivant :  
 
include <iostream>
using namespace std ;
using std::endl ;
 
struct CL {
     private :
              float z ;
      public :  
             float x ;
             
};
   
   main()
 
   {CL n; int k ;
   n.x=12 ; n.z=15 ;
   cout<<n.x<<endl ;
   cout<<n.z<<endl ;
   cin>>k ;
         }
 
il n'y ait pas de message d'erreur et qu'il s'affiche bien 12 et 15 alors que z est un membre privé de CL. On ne devrait normalement pas y avoir accès à partir du main().
Merci de votre aide !


Message édité par alain niala le 29-05-2006 à 12:54:05
Reply

Marsh Posté le 29-05-2006 à 12:42:30   

Reply

Marsh Posté le 29-05-2006 à 13:14:54    

t'as essayé en déclarant une classe plutot qu'une struct ?


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 29-05-2006 à 13:19:07    

oui j'ai essayé les deux ça ne change rien !

Reply

Marsh Posté le 29-05-2006 à 14:01:18    

tu utilises quel compilateur :??:
 
plusieurs choses en attendant:
- ca ne compile pas directement parce qu'il manque le '#' de l'include.
- ton "using std::endl", c'est n'importe quoi.
- utilises les balises de code.
- l'entete de main est fausse.
- ton code ne compile pas sous vc6, et c'est normal:

Code :
  1. --------------------Configuration: teststruct - Win32 Debug--------------------
  2. Compiling...
  3. main.cpp
  4. C:\Program Files\Microsoft Visual Studio\MyProjects\teststruct\main.cpp(16) : error C2248: 'z' : cannot access private member declared in class 'CL'
  5.         C:\Program Files\Microsoft Visual Studio\MyProjects\teststruct\main.cpp(7) : see declaration of 'z'
  6. C:\Program Files\Microsoft Visual Studio\MyProjects\teststruct\main.cpp(18) : error C2248: 'z' : cannot access private member declared in class 'CL'
  7.         C:\Program Files\Microsoft Visual Studio\MyProjects\teststruct\main.cpp(7) : see declaration of 'z'
  8. C:\Program Files\Microsoft Visual Studio\MyProjects\teststruct\main.cpp(20) : warning C4508: 'main' : function should return a value; 'void' return type assumed
  9. Error executing cl.exe.
  10. main.obj - 2 error(s), 1 warning(s)


Message édité par _darkalt3_ le 29-05-2006 à 14:01:35
Reply

Marsh Posté le 29-05-2006 à 14:05:58    

Citation :

- ton "using std::endl", c'est n'importe quoi.


 
comment ca ?

Reply

Marsh Posté le 29-05-2006 à 14:11:38    

using std suffit


---------------
Töp of the plöp
Reply

Marsh Posté le 29-05-2006 à 14:19:18    

ouai, enfin c'est pas n'importe quoi, juste inutile et surtout 'using std::' c'est toujours mieux que 'using namespace std'

Reply

Marsh Posté le 29-05-2006 à 14:27:13    

skelter a écrit :

ouai, enfin c'est pas n'importe quoi, juste inutile


Ca montre que le mec a pas compris ce qu'était un namespace.
 

skelter a écrit :

et surtout 'using std::' c'est toujours mieux que 'using namespace std'


Ah bon ?


---------------
Töp of the plöp
Reply

Marsh Posté le 29-05-2006 à 14:35:23    


 
 
quand on a compris ce qu'est un namespace, on sait qu'il est preferable (dans l'ordre)
de ne jamais utiliser la directive using
d'utiliser la directive using en portee minimale
d'utiliser la directive using sur un nom explicite plutot que sur l'ensemble des noms d'un namespace
 
faire 'using namespace std' ca revient à mettre tout les noms presents dans le namespace std (dans la TU) dans le namespace global de la portee courante, faut en avoir conscience

Message cité 1 fois
Message édité par skelter le 29-05-2006 à 14:36:25
Reply

Marsh Posté le 29-05-2006 à 14:36:21    

_darkalt3_ a écrit :

Ca montre que le mec a pas compris ce qu'était un namespace.


Peut-être que le mec en question a compris la différence entre using directive et using declaration ?
 
 
 

Reply

Marsh Posté le 29-05-2006 à 14:36:21   

Reply

Marsh Posté le 29-05-2006 à 14:48:30    

skelter a écrit :

quand on a compris ce qu'est un namespace, on sait qu'il est preferable (dans l'ordre)
de ne jamais utiliser la directive using
d'utiliser la directive using en portee minimale
d'utiliser la directive using sur un nom explicite plutot que sur l'ensemble des noms d'un namespace
 
faire 'using namespace std' ca revient à mettre tout les noms presents dans le namespace std (dans la TU) dans le namespace global de la portee courante, faut en avoir conscience


 
en l'occurence, on a ici

Code :
  1. using namespace std ;
  2. using std::endl ;



---------------
Töp of the plöp
Reply

Marsh Posté le 29-05-2006 à 14:57:25    

moi je vote pour 'using std::endl'

Reply

Marsh Posté le 29-05-2006 à 15:00:23    

pour moi, ca dépend surtout de savoir si on sait ce qu'on fait ou non [:spamafote]


---------------
Töp of the plöp
Reply

Marsh Posté le 29-05-2006 à 18:54:54    

Merci, ça vient donc du compilateur... J'utilise GCC 3.4.2. Pour l'histoire de namespace vous avez raison je ne sais pas ce que je fais, j'ai juste recopié l'en-tête dans un bouquin d'exercices de C++.

Reply

Marsh Posté le 29-05-2006 à 18:58:55    

ah ben bravo :o

Reply

Marsh Posté le 29-05-2006 à 19:08:28    

Bon j'ai décoché la case 'turn off all access checking' dans les options de compilation de dev-c++ et maintenant il compile plus... :)

Reply

Marsh Posté le 29-05-2006 à 20:50:37    

Est-ce que tu peux la ligne de commande que crée dev-c++ pour invoquer g++ ? (dans les 2 cas)

Reply

Marsh Posté le 29-05-2006 à 22:35:51    

++fab a écrit :

Est-ce que tu peux poster la ligne de commande que crée dev-c++ pour invoquer g++ ? (dans les 2 cas)


 [:aloy]
[:dawa]


Message édité par _darkalt3_ le 29-05-2006 à 22:36:06

---------------
Töp of the plöp
Reply

Marsh Posté le 31-05-2006 à 00:01:35    

up :o

Reply

Marsh Posté le 31-05-2006 à 00:18:20    

option -fno-access-control
 
extrait du manuel de gcc

Citation :

-fno-access-control
           Turn off all access checking.  This switch is mainly useful for
           working around bugs in the access control code.

Reply

Marsh Posté le 31-05-2006 à 00:28:42    

Je ne connaissais pas. Merci.


Message édité par ++fab le 31-05-2006 à 00:29:03
Reply

Marsh Posté le 31-05-2006 à 00:32:18    

alain niala a écrit :

Bon j'ai décoché la case 'turn off all access checking' dans les options de compilation de dev-c++ et maintenant il compile plus... :)


 
[:totoz] c'est quoi cette option du malin


Message édité par kadreg le 31-05-2006 à 00:32:26

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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