[C++] Les fameuses classes

Les fameuses classes [C++] - Programmation

Marsh Posté le 16-10-2001 à 08:55:56    

Bon ben c'est encore moi :)
 
Je viens de recevoir un magnifique mail contenant un cpp et un h dont voici un extrait:
 
cpp:
 
nt TVoidDataStruct::Realloc(uint32 newSize)
{
 char *newBuf = (newSize > 0) ? new char[newSize] : NULL;
   if (newBuf)
   {
    memset(newBuf, 0, newSize);
      if (Buf)
     memcpy(newBuf, Buf, min(newSize, Size));
   }
   if (Buf)
    delete[] Buf;
   Buf = newBuf;
   Size = newSize;
   return 0;
}
 
int TVoidDataStruct::FreeMem()
{
   if (Buf)
    delete[] Buf;
   Buf = NULL;
   Size = 0;
   return 0;
}
 
 
h:
 
 
typedef struct _PH_UTILCLASS TVoidDataStruct
{
public:
   char  *Buf;
   uint32 Size;
public:
   TVoidDataStruct();
   TVoidDataStruct(const TVoidDataStruct &);
   ~TVoidDataStruct();
   int Realloc(uint32 newSize);
   int FreeMem();
   bool operator==(const TVoidDataStruct &)const;
   TVoidDataStruct &operator=(const TVoidDataStruct &);
   DECLARE_PH_STREAMABLE(TVoidDataStruct)
}TVoidDataStruct;
 
typedef TVoidDataStruct TSupplierConfigData;
 
 
Le probleme c'est que j'y comprends pas grand chose :(

Reply

Marsh Posté le 16-10-2001 à 08:55:56   

Reply

Marsh Posté le 16-10-2001 à 08:58:41    

a vu de nez c'est une classe qui gere un tableau dont tu peux modifier la taille dynamiquement

Reply

Marsh Posté le 16-10-2001 à 09:00:34    

a moins que tu ne veuille savoir ce qu'est une classe :??:

Reply

Marsh Posté le 16-10-2001 à 09:02:56    

Ben c'est plutot le fonctionnement en fait.
J'ai fait un peu de java, mais pas longtemps et je m'y suis pas vraiment interesse.
 
Y a les public qui me genent, puis comment on appelle la classe, comment ca marche, etc...

Reply

Marsh Posté le 16-10-2001 à 09:14:11    

okay
 
dans une classe tu as trois type de champ : public, prive et protege (public, private, protected)
 
Mettons :
 
class pouet
{
public:
   pouet();
   ~pouet();
 
   int a;
   void machin();
 
private:
   int b;
};
 
On a donc defini une classe pouet (note dans ton cas c une structure,mais en C++ entre structure et classe, y a pu grande difference)
 
Dans le reste du code tu peux faire :
 
pouet uneClasse;
 
ceci va creer une instance de pouet et appeler le constructeur de celle ci (pouet())
 
uneClasse.a  =20;  
ca c ok . a est public, tu peux y acceder
 
uneClasse.b = 30;
marche pas . best ans le champ private, ce qui signifie qu'il n'est pas accesible de l'exterieur
 
par contre :
 
void pouet::machin()
{
   b = 30;
}
 
marchera, car la fonction machin, qui appartient a la classe pouet a le droit de modifier les champs private
 
protected, c comme private, sauf que les classes derivee auront acces au variable / fonction protege (mais pas private)
 
En public tu ne met que ce l'utilisateur "final" a besoin et dans private ce dont la classe a besion puor fonctionner, mais qui n'est pas necessaire a l'utilisateur (tu me suis ?)
 
(c exactement comme du java, sauf que tu ne met public/private/protected qu'une fois par bloc et pas devant chaque fonction/variable membre)
 
J espere que g ete a peu pres clair... sinon demande

Reply

Marsh Posté le 16-10-2001 à 09:20:47    

pour le debut j'ai cale, par contre arrive au void pouet::machin je suis un peu largue parce que je vois pas ce que ca veut dire les ::

Reply

Marsh Posté le 16-10-2001 à 09:21:12    

Bon c'est un melange de C et de C++...
 
Les public: tu les oublies ils ne servent a rien (dans ce contexte ci).
 
TVoidDataStruct et TSupplierConfigData sont synonynes et utilisable l'un a la palce de l'autre (typedef)
 
ce sont des types, tu peut declarer une variable de ce type :
TSupplierConfigData toto;
ensuite tu peut utiliser les attributs
toto.Buf...  
ou les methodes
toto.Realloc(128) pour une chaine de 127 caracteres dans Buf...
toto.FreeMem() pour liberer la memoire...
 
faire des affectation :
toto = titi
ou des comparaisons
if (toto == titi)
 
DECLARE_PH_STREAMABLE je ne connais pas mais ca doit etre pour serializer l'objet (si j'ose dire)
 
 
_PH_UTILCLASS je ne connais pas plus mais ce dois etre le declarateur d'import/export....

Reply

Marsh Posté le 16-10-2001 à 09:22:23    

Godbout a écrit a écrit :

pour le debut j'ai cale, par contre arrive au void pouet::machin je suis un peu largue parce que je vois pas ce que ca veut dire les ::  




pouet::machin signifie que machin appartiens a pouet...

Reply

Marsh Posté le 16-10-2001 à 09:23:22    

BENB a écrit a écrit :

Bon c'est un melange de C et de C++...
 
Les public: tu les oublies ils ne servent a rien (dans ce contexte ci).
 
TVoidDataStruct et TSupplierConfigData sont synonynes et utilisable l'un a la palce de l'autre (typedef)
 
ce sont des types, tu peut declarer une variable de ce type :
TSupplierConfigData toto;
ensuite tu peut utiliser les attributs
toto.Buf...  
ou les methodes
toto.Realloc(128) pour une chaine de 127 caracteres dans Buf...
toto.FreeMem() pour liberer la memoire...
 
faire des affectation :
toto = titi
ou des comparaisons
if (toto == titi)
 
DECLARE_PH_STREAMABLE je ne connais pas mais ca doit etre pour serializer l'objet (si j'ose dire)
 
 
_PH_UTILCLASS je ne connais pas plus mais ce dois etre le declarateur d'import/export....  




 
Pour tout ce qui est struct, ca je connais, c'est plutot au niveau des classes que ca me pose un pb.
J'arrive pas bien a assimiler le principe des classes, a comprendre a koi elles servent (qu'est ce qu'elles ont de plus qu'une fonction)

Reply

Marsh Posté le 16-10-2001 à 09:33:39    

Une class ressemble a une struct...
les differences...
la struct C ne comporte que des donnes...
les struct et class en C++ comportent des fct qui agissent sur les donnees (de la class ou struct)
 
dans une struct tout est public par defaut (accessible a tout le monde...
 
dans une class tout est private par defaut (accessible uniquement aux membres de la classe)
 
les mots cle public: private: servent a changer cela mais je ne vais pas reexpliquer ce que dis chrisbk...
 
Pour une vision simpliste....
 
struct ou class servent a encapsuler des donnees et des fonctions. Quand tu est a l'exterieur tu dois indiquer que ce que tu veux est a l'interieur, quand tu est a l'interieur c'est implicite...
les :: servent a acceder a un type ou a un fonction depuis la classe...
le . sert a acceder a un membre depuis une variable (une instance de la classe)
le -> sert a acceder a un membre depuis un pointeur sur une instance...

Reply

Marsh Posté le 16-10-2001 à 09:33:39   

Reply

Marsh Posté le 16-10-2001 à 09:43:32    

Je vois pas bien a quoi ca sert une classe.
J'ai l'habitude de faire des fonctions, et je vois pas comment je pourrais faire mes fonctions en classe.

Reply

Marsh Posté le 16-10-2001 à 09:49:02    

c'est une autre vision du code, en qqsorte
 
tu ne fais plus des fonction qui travaillent sur des structures, mais des classes, avec leur propre fonction
 
imagine une struct / classe bitmap qui charge une image
 
en C :
struct bitmap
{
blah...
}
 
 
void load(&mabitmap.....)
 
en C++
 
clas Bitmap
{
 void load(....)
}
 
see ?
 
ca te permet aussi de ne montrer que ce que tu veux . par exemple tu peux imaginer une classe qui gere une liste chaine, gardant les pointeur vers suivant / precedent en private
 
comme ca t'es sur que tes pointeurs ne se promenent pas ce ci de la
 
 
 
le passage C => C++ s'est pas mal fait dans la douleur, du moins puor moi, fo changer ta maniere de voir les choses
et au debut je peux te jurer que mon code C++ etait particulierement infect :D

Reply

Marsh Posté le 16-10-2001 à 09:53:35    

Ben je sais pas si t'y es passe tout seul, moi j'ai personne au boulot pour me filer un coup de main (petite boite), alors c'est clair que ca va etre douloureux, surtout qu'ils veulent des choses rapidement...

Reply

Marsh Posté le 16-10-2001 à 09:59:09    

Godbout a écrit a écrit :

Je vois pas bien a quoi ca sert une classe.
J'ai l'habitude de faire des fonctions, et je vois pas comment je pourrais faire mes fonctions en classe.  




Alors fait des fonctions...
Dans ce domaine il ne faut pas se forcer...
pour ma part j'ai des choses qui me viennent spontanement comme des classes et d'autres comme des fonctions...
 
sinon j'approuve chrisbk : en general tu fais une classe quand tu ferais une famille de fonctions pour manipuler une structure...
 
Le but des classes c'est de ne plus acceder aux donnees elles meme mais de les recuperer par des fonctions de la classe...
imagine une classe individu : tu vas stocker uniquement la date de naissance, mais tu peut prevoir une methode age qui calcule l'age comme cela : 1- plus d'incoherence puisque le concepteur maitrise l'ensembles des fct accedenant aux donnes (verification de plages de valeurs...)
2 - en cas de modif de la structure, l'utilisateur n'est pas gene si le jeu de methodes reste le meme...

Reply

Marsh Posté le 16-10-2001 à 09:59:51    

ouais, enfin plus ou moins tout seul
 
mais bon, franchement au debut....je n'ose meme plus y repenser :D
 
Good Luck !

Reply

Marsh Posté le 16-10-2001 à 11:07:39    

BENB a écrit a écrit :

 
imagine une classe individu : tu vas stocker uniquement la date de naissance, mais tu peut prevoir une methode age qui calcule l'age comme cela : 1- plus d'incoherence puisque le concepteur maitrise l'ensembles des fct accedenant aux donnes (verification de plages de valeurs...)
2 - en cas de modif de la structure, l'utilisateur n'est pas gene si le jeu de methodes reste le meme...  




 
Merci pour l'exemple, ca me donne deja plus une idee du concept

Reply

Marsh Posté le 16-10-2001 à 11:23:12    

J'aime bien le bouquin de Bjarne Stroustrup, mais certains le trouvent difficile d'acces, sinon regarde vers les bouquin d'UML
 
et tu comprendra sans doute mieux le concept de l'objet...
qui tant a decoupler l'interface de l'implementation
 
Mais surtout ne te force pas, n'essaye pas de faire en classe des choses que tu "sens" mieux en Fonction... N'en deplaise aux fanatiques de l'objet ;) les fonction "globales" c'est pas si mal...
 
Bon courage.

Reply

Marsh Posté le 16-10-2001 à 11:33:31    

Merci ;)

Reply

Marsh Posté le 16-10-2001 à 11:42:15    

Encore une p'tite question ;)
 
extern "C" const char* _export WINAPI GetErrorMsg()
{
   return LastError?LastError:"Ok";
}
 
extern "C" c'est pour exporter la fonction lorsqu'elle est ecrite en C c'est bien ca ?

Reply

Marsh Posté le 16-10-2001 à 12:11:16    

Godbout a écrit a écrit :

Encore une p'tite question ;)
 
extern "C" const char* _export WINAPI GetErrorMsg()
{
   return LastError?LastError:"Ok";
}
 
extern "C" c'est pour exporter la fonction lorsqu'elle est ecrite en C c'est bien ca ?  




En C++ plusieurs fonctions peuvent porter le meme nom a condition que la liste de leur arguments soit differente.
 
Pour les differencier le compilo ajoute des decorations...
Ces decorations ne font l'objet d'aucun standard, d'un compilo a l'autre il n'y a aucune raison pour que ce soi les memes...
 
ces decoration ne sont pas une particularite du C++, le C ajoute un _ devant les nom de fonctions
 
extern "C" permet de generer en C++ une fonction avec des decorations C plutot que C++
l'interet est de pouvoir editer des liens avec des binaires ecrits en C (qui ne peuvent generer des decoration C++) ou d'autres langages ou compiles avec un autre compilo ou pouvoir utiliser GetProcAdress sans avoir a rechercher les decoration dans les binaires.
 
Ici il me semble (le extern "C" ) avec le WINAPI qui lui utilise la convention d'appel Pascal (d'ou exit les decorations C++ aussi)
 
Pour exporter une fonction il faut la declarer avec un truc du genre declspec(dllexport) il me semble, et tu peux exporter ce que tu veux, fonctions (C/C++), variables, struct, class, etc...

 

[edtdd]--Message édité par BENB--[/edtdd]

Reply

Sujets relatifs:

Leave a Replay

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