Les fameuses classes [C++] - Programmation
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
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...
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
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 ::
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....
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...
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)
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...
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.
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
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...
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...
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
Good Luck !
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
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.
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 ?
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]
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