Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#51 Le 02/11/2007, à 20:04

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

Il faut bien utiliser un for quelque part. S'il est dans la classe ubuntero, alors tu ne peux plus utiliser l'instance courante et il faut utiliser des pointeurs. C'est moche et ça fait très "C"...

// main.cpp


/*=== Header ===*/

#include<iostream>
#include<string>
using namespace std;


/*=== Classe ubuntero ===*/

class ubuntero {
      
      private:
             string pseudo;
             string email;
             int age;
      
      public:
             ubuntero();
             ~ubuntero();
             static void remplit(ubuntero* u, int SIZE);
             static void affiche(ubuntero* u, int SIZE);
};


/*=== Constructeur ubuntero ===*/

ubuntero :: ubuntero() {
            cout << "Construction de ubuntero" << endl;
            pseudo = "empty";
            email  = "empty";
            age = 0;
}


/*=== Destructeur ~ubuntero ===*/

ubuntero :: ~ubuntero() {
            cout << "Destruction de ubuntero" << endl;
            /*ICI IL FAUDRAIT FAIRE LE TRUC AVEC DELETE MAIS Y A PAS DE NEW ALORS...*/
}


/*=== Méthode remplit ===*/

void ubuntero :: remplit(ubuntero* u, int SIZE){
     
     int i;
     for(i=0 ; i<SIZE ; i++) {
            cout << "Tapez le pseudo (ou q pour quitter) : ";
            cin >> u[i].pseudo;      // LE PB EST ICI
            if (u[i].pseudo == "q") {break;}
            cout << "Tapez l'email : ";
            cin >> u[i].email;       // LE PB EST ICI
            cout << "Tapez l'âge : ";
            cin >> u[i].age;         // LE PB EST ICI
     }
}


/*=== Méthode affiche ===*/

void ubuntero :: affiche(ubuntero* u, int SIZE){
     
     int i;
     for(i=0 ; i<SIZE ; i++) {
            cout << "Le pseudo est : " << u[i].pseudo << endl;           // LE PB EST ICI
            cout << "L'email est : "   << u[i].email  << endl;           // LE PB EST ICI
            cout << "L'âge est : "     << u[i].age    << endl << endl;   // LE PB EST ICI
     }
}


/*=== Fonction main ===*/

int main(int argc, char* argv[]) {   //IL FAUT ECRIRE STRING ARGV[] MAINTENANT ?? non
    
    int i, SIZE;
    string question;
    
    cout << "Combien de membres souhaitez-vous inscrire ?" << endl;
    cin >> SIZE;
    
    ubuntero membre[SIZE];   // INSTANCES de la classe ubuntero      
    
    ubuntero::remplit(membre, SIZE);
    ubuntero::affiche(membre, SIZE);
    
    system("read");
    return 0;    
}

Tu devrais jeter un coup d'oeil à ma version du code pour voir quelles méthodes plus "propres" on peut utiliser pour arriver à ce résultat.
À mon avis, une boucle for sur un tableau devrait être située dans la fonction qui est responsable du tableau, à savoir main(). Parce qu'une seule erreur dans les arguments passés à remplit() ou affiche() (qui sont publiques !) et c'est foutu. Le principe du C++ c'est avant tout d'éliminer au maximum la possibilité de faire des erreurs, même lorsqu'il s'agit de son propre code.

Hors ligne

#52 Le 02/11/2007, à 21:59

$Gaël$

Re : Questions sur la P.O.O. (C++ et JAVA)

Bon j'arrive peut-être un peu tard....

Le problème de ta méthode remplit est que tu "es déja dans la classe" ubuntero, tu a donc directement accès aux données membres donc :

cin >> ubuntero[i].pseudo;

devient

cin >> pseudo;

Ensuite pour ton problème de remplissage de tableau, comme te le conseille Link31, d'un point de vue conception il est mieux que l'itération d'action sur tes membres soit faite dans le main.
Si tu veux éviter les for tu peux aller voir du côté des containers et des itérateurs (peut-être la classe vector), mais ca ne fait plus parti des notions de base selon moi...

Je peux te conseiller le site www.cpluscplus.com qui possède quelques tutorials sur le C++ et une documentation avec outil de recherche des classe de la stl.


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#53 Le 02/11/2007, à 22:16

Le Farfadet Spatial

Re : Questions sur la P.O.O. (C++ et JAVA)

Salut à tous !

$Gaël$ a écrit :

Si tu veux éviter les for tu peux aller voir du côté des containers et des itérateurs (peut-être la classe vector)

En effet, on peut utiliser des itérateurs sur la classe vector, je confirme --- pour le cas où j'ai bien compris la question.

mais ca ne fait plus parti des notions de base selon moi...

C'est également mon avis.

   Ici, un for dans main serait bienvenue, tout simplement.

   À bientôt.

                                                                                                                                                Le Farfadet Spatial

Hors ligne

#54 Le 03/11/2007, à 02:47

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

A propos de la classe vector, est-ce la meilleure façon d'utiliser les tableaux en C++ ? Parce que passer des tableaux par adresse pour leur appliquer une fonction c'est faisable mais c'est vrai que c'est très pénible...

Donc que me conseillez-vous ? Quelle est la référence ? Tableau = vector en cpp ??? smile

edit : Maintenant je déclare mon tableau membre[SIZE] comme ceci :

vector <ubuntero> membre(SIZE);

J'ai lu qqes trucs sur la classe vector et ça semble convaincant. Maintenant je ne vois pas l'intéret de faire ça par rapport à un tableau tout court. Et en quoi cela me permet d'appliquer mes méthodes sur le tableau membre sans tout reprogrammer ??

Désolé pour ces questions un peu lourdingues mais j'esssaye vraiment de m'en sortir en utilisant mes idées car j'apprends mieux ainsi smile

Dernière modification par aganim07 (Le 03/11/2007, à 03:02)

Hors ligne

#55 Le 03/11/2007, à 09:22

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

aganim07 a écrit :

J'ai lu qqes trucs sur la classe vector et ça semble convaincant. Maintenant je ne vois pas l'intéret de faire ça par rapport à un tableau tout court.

L'intérêt ? Mais la puissance de la STL bien sûr !

Regarde ce à quoi tu as accès en utilisant un vector plutôt qu'en utilisant un simple tableau C :
http://www.cplusplus.com/reference/stl/vector/

(note : même si les vecteurs et les itérateurs sont deux choses magnifiques, il n'empêche que ça ne doit pas te faire oublier de toujours tester la taille du tableau et de tester la validité des itérateurs, comme tu le ferais avec des pointeurs -mais en mieux wink-).

Hors ligne

#56 Le 03/11/2007, à 11:53

$Gaël$

Re : Questions sur la P.O.O. (C++ et JAVA)

L'avantage d'utiliser un container à la place d'un tableau est d'ajouter une couche d'abstraction à ton stockage de données.
Tu n'as plus à te demander si l'index de ton tableau pointe bien au bon endroit pour accéder au prochain élément, tu as juste à utiliser la méthode qui dit "donne moi le prochain élément.
C'est l'avantage de la programmation objet (C++ par exemple) par rapport à la programmation fonctionnelle (C). Dans un LOO tu demandes à l'objet de faire ce qui t'intéresse et il se débrouille pour le réaliser alors qu'avec un langage  fonctionnel tu dois savoir toujours "mettre les mains dans le cambouis" pour réaliser l'action en question.

-- edit
C'est le même principe qu'avec les string : qu'est ce qui est plus simple pour copier une chaine str1 dans une chaine str2 ?

str1=str2

ou

str1[0]=str2[0]
str1[1]=str2[1]
...

, qui est en fait ce que réalise strcpy (l'exemple n'est pas très bon mais c'est l'idée..)

Dernière modification par $Gaël$ (Le 03/11/2007, à 11:57)


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#57 Le 03/11/2007, à 12:46

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

$Gaël$ a écrit :

L'avantage d'utiliser un container à la place d'un tableau est d'ajouter une couche d'abstraction à ton stockage de données.
Tu n'as plus à te demander si l'index de ton tableau pointe bien au bon endroit pour accéder au prochain élément, tu as juste à utiliser la méthode qui dit "donne moi le prochain élément.
C'est l'avantage de la programmation objet (C++ par exemple) par rapport à la programmation fonctionnelle (C). Dans un LOO tu demandes à l'objet de faire ce qui t'intéresse et il se débrouille pour le réaliser alors qu'avec un langage  fonctionnel tu dois savoir toujours "mettre les mains dans le cambouis" pour réaliser l'action en question.

-- edit
C'est le même principe qu'avec les string : qu'est ce qui est plus simple pour copier une chaine str1 dans une chaine str2 ?

str1=str2

ou

str1[0]=str2[0]
str1[1]=str2[1]
...

, qui est en fait ce que réalise strcpy (l'exemple n'est pas très bon mais c'est l'idée..)

Donc en gros la classe vector en C++ c'est comme manipuler des tableaux en fortran.

Quand on écrit A = B*C;
Le PC comprend que la matrice A est égale au produit des matrices B et C ? smile

Hors ligne

#58 Le 03/11/2007, à 12:50

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

Heu... on parle de vecteurs, pas de matrices il me semble. Et tu ne peux pas multiplier des vecteurs comme ça, ce n'est pas prévu puisque les vecteurs de la STL peuvent contenir des données arbitraires. Il faut surcharger l'opérateur * pour arriver à ce que tu veux.

Hors ligne

#59 Le 03/11/2007, à 13:01

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Bin quelle différence entre un vecteur et une matrice ? Un vecteur n'est jamais qu'une matrice à une dimension.
Et comme on peut faire des vecteurs multidimensionnels (cad des matrices) ben ça revient au même big_smile

Mais en gros ça maintenant mon programme est censé l'accepter ?

vector <ubuntero> membre(SIZE);   // INSTANCES de la classe ubuntero      
    
    membre.remplit(SIZE);        // ICI évidemment ça ne va plus...
    membre.affiche(SIZE);        // ICI non plus du coup...

En tout cas le compilateur crie toujours concernant la syntaxe des fonction remplit et affiche.
Dès qu'il rencontre un ubuntero[i].pseudo par exemple, il n'en veut pas.

Dernière modification par aganim07 (Le 03/11/2007, à 13:08)

Hors ligne

#60 Le 03/11/2007, à 13:26

Watchwolf

Re : Questions sur la P.O.O. (C++ et JAVA)

en programmation un vector n'est pas la même chose qu'un vecteur mathématique. Une vecteur en programmation c'est une liste d'elements. les caractéristiques (du moins celle que j'ai en tête):
- on alloue n places, plus que nécessaire peut être
- ajout: si case libre déjà alloué on l'utilise
  sinon on alloue de nouveau n cases

les n cases forment un vecteur, voila. Tu n'a pas forcement une valeur mathématiques dans les cases.

Hors ligne

#61 Le 03/11/2007, à 14:55

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

aganim07 a écrit :

Bin quelle différence entre un vecteur et une matrice ? Un vecteur n'est jamais qu'une matrice à une dimension.
Et comme on peut faire des vecteurs multidimensionnels (cad des matrices) ben ça revient au même big_smile

Hmmm... d'accord, je reconnais que j'ai toujours confondu (?) vecteur et matrice. Mais je suis programmeur, et toi tu es physicien wink

edit : comme le dit Watchwolf, "vecteur" n'a pas le même sens en maths et en programmation.

aganim07 a écrit :

Mais en gros ça maintenant mon programme est censé l'accepter ?

vector <ubuntero> membre(SIZE);   // INSTANCES de la classe ubuntero      
    
    membre.remplit(SIZE);        // ICI évidemment ça ne va plus...
    membre.affiche(SIZE);        // ICI non plus du coup...

En tout cas le compilateur crie toujours concernant la syntaxe des fonction remplit et affiche.
Dès qu'il rencontre un ubuntero[i].pseudo par exemple, il n'en veut pas.

Ça ne fonctionne pas parce que membre est un vector (un vector de ubuntero, d'accord, mais un vector quand même). vector est une classe, plus exactement une classe template (une classe qui s'adapte à un certain type comme je te l'ai déjà expliqué). Comme la classe vector n'a pas de fonctions remplit() ou affiche(), tu ne peux pas les appeler comme ça.

Le mieux que tu puisses faire, c'est d'utiliser des fonctions remplit() et affiche() statiques dans la classe ubuntero (pour accéder aux membres privés), et des les appeler ainsi :

ubuntero::remplit(membre, SIZE);
ubuntero::affiche(membre, SIZE);

Le mieux que tu puisses faire tout court, c'est de revoir la structure de ton code.

Dernière modification par Link31 (Le 03/11/2007, à 14:56)

Hors ligne

#62 Le 03/11/2007, à 17:19

Le Farfadet Spatial

Re : Questions sur la P.O.O. (C++ et JAVA)

Salut à tous !

   Argh ! J'ai des choses qui font mal à mon petit cœur de mathématicien qui fait de l'informatique théorique !

   D'abord, une grosse confusion de la part de $Gaël$ : C n'est pas un langage fonctionnel. C'est un langage impératif structuré faiblement typé. Un exemple typique de langage fonctionnel, c'est Haskel (c'est même l'archétype des langages fonctionnels). C ne possède pas les très grands avantages des langages fonctionnels, comme, un exemple parmi tant d'autre, les fonctions de l'ordre supérieur.

   Pour un théoricien comme moi, l'approche fonctionnelle c'est vraiment formidable ! D'abord, pour ainsi dire les bogues n'existent pas en fonctionnel. Ensuite, le grand avantage c'est que tout est calcul. De plus, les capacités d'optimisation des compilateurs sont meilleurs en fonctionnel qu'en orienté objet. En tout cas, on ne peut pas opposer la programmation orientée objet et la programmation fonctionnelle et dire que l'orienté objet, c'est mieux. D'ailleurs, Haskel permet la programmation orientée objet. Et, encore une fois, C n'est pas fonctionnel.

aganim07 a écrit :

A propos de la classe vector, est-ce la meilleure façon d'utiliser les tableaux en C++ ?

Oui.

Parce que passer des tableaux par adresse pour leur appliquer une fonction c'est faisable mais c'est vrai que c'est très pénible...

De toute évidence, tu ne connais pas le passage par référence. Pourtant, c'est quelque chose d'essentiel en C++. Par exemple, tu as un prototype de ce genre :

int fonction (const vector<T> &vecteur);

Note la présence de l'esperluette (&), qui indique qu'il s'agit d'une référence. Le const indique que le vecteur ne doit pas être modifié par la fonction. Son appel ce fait ainsi :

x = fonction(vecteur);

Tout simplement.

   Au sein de la fonction, le vecteur s'utilise comme d'habitude :

y = vecteur[i];

N'est-ce pas formidable ? Si la fonction doit pouvoir modifier les valeurs de vecteur, le prototype doit ressembler à ça :

int fonction (vector<T> &vecteur);

Le passage par référence fonctionne quel que soit le type de la variable : type intégré, classe définie par le programmeur et ainsi de suite.

   Sinon, si tu cherches des vecteurs qui soient vraiment utilisables comme en mathématiques, ainsi que des matrices, je t'invite à consulter la bibliothèque Boost. Cela dit, essaye de déjà maîtriser le langage avant de chercher à manipuler cette bibliothèque.

   À bientôt.

                                                                                                                                            Le Farfadet Spatial

Dernière modification par Le Farfadet Spatial (Le 03/11/2007, à 17:22)

Hors ligne

#63 Le 03/11/2007, à 17:27

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Merci smile Sinon je suis d'accord avec toi le C est impératif pas fonctionnel.
Je connais un tout petit peu de fonctionnel avec O'Caml. Notamment une sorte d'équivalent du switch qui s'appelle le pattern matching (filtrage de motifs). C'est un de mes seuls souvenirs en O'Caml. Ah si je me souviens aussi que chaque instruction se termine par deux point-virgules !! Toute une époque big_smile

Dernière modification par aganim07 (Le 03/11/2007, à 17:30)

Hors ligne

#64 Le 03/11/2007, à 17:33

Le Farfadet Spatial

Re : Questions sur la P.O.O. (C++ et JAVA)

Re-salut à tous !

   Oui, je sais, j'en rajoute une couche, mais que voulez-vous...

aganim07 a écrit :

Notamment une sorte d'équivalent du switch qui s'appelle le pattern matching (filtrage de motifs).

En réalité, le switch de C (et C++) rappel un peu le filtrage de motifs, mais il n'a pas la puissance et la souplesse du filtrage de motif d'OCaML et encore moins de celui de Haskel --- le plus puissant que je connaisse.

   Cela dit, OCaML c'est vraiment très bien.

   Ah ! J'y pense : encore une fois, je te recommande (pour ne pas dire plus) le livre de Stroustrup. Par exemple, le passage par référence y est brillamment expliqué, ainsi que comment l'utiliser de manière efficace.

   À bientôt.

                                                                                                                                                Le Farfadet Spatial

Hors ligne

#65 Le 03/11/2007, à 19:12

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Walà je pense être arrivé à un résultat satisfaisant compte-tenu de mon niveau !

Fichier main.cpp

// main.cpp


/*=== Header ===*/

#include<iostream>
#include<string>
#include<vector>
#include"classe.h"
using namespace std;


/*=== Fonction main ===*/

int main(int argc, char* argv[]) {
    
    int i, SIZE;
    
    cout << "Combien de membres au total souhaitez-vous inscrire ?" << endl;
    cin >> SIZE;
    
    vector <ubuntero> membre(SIZE);   // INSTANCES de la classe ubuntero      
    
    for(i=0 ; i<SIZE ; i++) {membre[i].remplit(SIZE);}  
    for(i=0 ; i<SIZE ; i++) {membre[i].affiche(SIZE);}
    
    system("PAUSE"); //Cette instruction fonctionne sous Dev Cpp avec Windows XP
    return 0;    
}

Fichier methodes.cpp

// methodes.cpp


/*=== Header ===*/

#include<iostream>
#include<string>
#include<vector>
#include"classe.h"
using namespace std;


/*=== Constructeur ubuntero ===*/

ubuntero :: ubuntero() {
            pseudo = "empty";
            email  = "empty";
            age = 0;
}


/*=== Destructeur ~ubuntero ===*/

ubuntero :: ~ubuntero() {
            /*ICI IL FAUDRAIT FAIRE LE TRUC AVEC DELETE MAIS Y A PAS DE NEW ALORS...*/
}


/*=== Méthode remplit ===*/

void ubuntero :: remplit(int SIZE){
     
     cout << "Tapez le pseudo : ";
     cin >> pseudo;
     cout << "Tapez l'email : ";
     cin >> email;
     cout << "Tapez l'âge : ";
     cin >> age;
}


/*=== Méthode affiche ===*/

void ubuntero :: affiche(int SIZE){

     cout << "Le pseudo est : " << pseudo << endl;
     cout << "L'email est : "   << email  << endl;
     cout << "L'âge est : "     << age    << endl << endl;
}

Fichier classe.h

#ifndef CLASSE_H
#define CLASSE_H

#include<iostream>
using namespace std;


/*=== Classe ubuntero ===*/

class ubuntero {
      
      private:
             string pseudo;
             string email;
             int age;
      
      public:
             ubuntero();
             ~ubuntero();
             void remplit(int SIZE);
             void affiche(int SIZE);
};


#endif

Dernière modification par aganim07 (Le 03/11/2007, à 19:56)

Hors ligne

#66 Le 03/11/2007, à 21:40

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

Très bien, tu as saisi le principe. Sans entrer dans le détail de techniques plus compliquées, c'est du bon code C++.
Juste une question : à quoi sert le "int SIZE" dans affiche() et remplit() ?

Hors ligne

#67 Le 03/11/2007, à 21:42

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Link31 a écrit :

Très bien, tu as saisi le principe. Sans entrer dans le détail de techniques plus compliquées, c'est du bon code C++.
Juste une question : à quoi sert le "int SIZE" dans affiche() et remplit() ?

A rien smile C'est un reste du temps ou ces deux méthodes contenaient une boucle for. Dans ce cas, je devais passer SIZE en argument des méthodes car c'était la valeur butoir des boucles for().

C'est un oubli, j'aurais du les retirer. Merci wink

Hors ligne

#68 Le 03/11/2007, à 22:02

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Je suis en train de lire le livre C++ pour les Nuls. Je sais que c loin d'être l'ouvrage de référence en C++ mais je le trouve plutôt bien écrit et surtout clairement présenté.

Je viens de comprendre ce qu'est un nom étendu, la portée d'une classe, les méthodes inline et outline... En fait maintenant que j'ai fait mon petit programme tout ça me parait d'une logique limite bateau.

Ce soir, je veux encore apprendre à faire un héritage, et utiliser les opérateurs new et delete !
Tout un programme (sans mauvais jeu de mots) tongue

Dernière modification par aganim07 (Le 03/11/2007, à 22:33)

Hors ligne

#69 Le 03/11/2007, à 22:48

$Gaël$

Re : Questions sur la P.O.O. (C++ et JAVA)

Euh j'aurais quelques remarques... big_smile

Tout d'abord, je m'excuse pour la confusion fonctionnel/impératif, je confonds tout le temps tongue

Le Farfadet Spatial a écrit :

En tout cas, on ne peut pas opposer la programmation orientée objet et la programmation fonctionnelle et dire que l'orienté objet, c'est mieux

Si on considère un langage impératif comme le C et un LOO (C++, Java, Ruby..) et que l'on regarde du point de vue des données, un LOO apporte une protection  de l'accès aux données et en général une facilité d'écriture.De ce point de vue je trouve qu'un LOO est meilleur qu'un langage impératif.

@aganim07 :
Des détails mais... pourquoi est-ce que ton .h et ton .cpp ne s'appellent pas pareil ? wink
Ensuite, l'idée d'utiliser les vector permettait de ne pas accéder à tes éléments comme pour un tableau...Ca ressemblerait d'avantage à cet exemple
Et juste par norme, en général on laisse les noms en majuscules aux constantes.

Mais sinon il y a une nette amélioration du code wink
Tu vas voir l'héritage c'est pas très dur...


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#70 Le 03/11/2007, à 22:58

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Déjà je viens de compre ce qu'est la surcharge d'une fonction. Qu'on différencie des fcts surchargées par le nombre et le type de leurs arguments, et aussi par la portée de leur classe. Mais pas par le type de retour car ce dernier ne fait pas partie du nom étendu.

Dingue ! big_smile:D:D

Hors ligne

#71 Le 04/11/2007, à 00:06

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Eh bien ! J'ai un nouveau lot de questions lol Je lis le chapitre sur les constructeurs et les destructeurs. J'ai vite compris qu'un constructeur est appelé automatiquement lorsqu'on déclare une instance de classe (cad un objet).
Le destructeur associé est appelé lorsqu'on quitte la fonction dans laquelle l'instance de classe a été déclarée. Jusque là ça va.

J'ajouterais que dans ce cas de figure, le contenu du destructeur se résume à rien. Comme dans mon programme ci-dessus. Mais je suppose que la désallocation se fait automatiquement et que le C++ sait quoi faire d'un destructeur ubuntero::~ubuntero.

MAIS je suis peaumé quand on parle de constructeur alloué sur le tas (cette fameuse mémoire heap). Première question : quoi c'est ça ?? Le heap ??
C'est pas que la définition de wikipedia.en soit incompréhensible mais en fait si elle est incompréhensible.


Deuxième question : quel est l'intéret de faire ceci :

ubuntero* pmembre = new ubuntero;

Plutôt que simplement ceci : ubuntero membre;

Pfiouuuuu, et il me reste encore à voir les constructeurs avec différents arguments (argh) et l'héritage de classe (double argh).

big_smile:(

Dernière modification par aganim07 (Le 04/11/2007, à 00:16)

Hors ligne

#72 Le 04/11/2007, à 00:55

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

aganim07 a écrit :

J'ajouterais que dans ce cas de figure, le contenu du destructeur se résume à rien. Comme dans mon programme ci-dessus. Mais je suppose que la désallocation se fait automatiquement et que le C++ sait quoi faire d'un destructeur ubuntero::~ubuntero.

Si tu n'as rien alloué avec "new" dans ta classe et que tu n'as rien de spécial à faire dans le destructeur, ne l'écris même pas, le compilateur s'en occupera tout seul.

aganim07 a écrit :

MAIS je suis peaumé quand on parle de constructeur alloué sur le tas (cette fameuse mémoire heap). Première question : quoi c'est ça ?? Le heap ??

Tout ce qui n'est pas la pile. La pile est un petit morceau de la RAM exclusivement réservé à ton programme et disponible dès son démarrage. Le reste, le "tas", est beaucoup plus grand, mais comme ton programme n'est pas seul sur le système il lui faut en réserver une partie (avec "new") avant de l'utiliser.

aganim07 a écrit :

Deuxième question : quel est l'intéret de faire ceci :
ubuntero* pmembre = new ubuntero;
Plutôt que simplement ceci : ubuntero membre;

La première forme te permet d'allouer de la mémoire sur le tas, et accessoirement de ne pas créer d'instance avant d'en avoir réellement besoin (utile dans le cas de membres d'une classe, il arrive qu'on ne veuille pas que tout soit construit automatiquement à la création). La deuxième alloue une instance sur la pile. C'est plus sûr que "new", mais plus limité : si tu alloues quelque chose de trop gros sur la pile : elle explose tongue

Hors ligne

#73 Le 04/11/2007, à 01:09

Le Farfadet Spatial

Re : Questions sur la P.O.O. (C++ et JAVA)

Salut à tous !

$Gaël$ a écrit :

Tout d'abord, je m'excuse pour la confusion fonctionnel/impératif, je confonds tout le temps tongue

Pour la peine, tu recopieras les chapitres 6 et 7 de l'évangile selon saint Knuth (The art of computer programming) !

Le Farfadet Spatial a écrit :

En tout cas, on ne peut pas opposer la programmation orientée objet et la programmation fonctionnelle et dire que l'orienté objet, c'est mieux

Si on considère un langage impératif comme le C et un LOO (C++, Java, Ruby..) et que l'on regarde du point de vue des données, un LOO apporte une protection  de l'accès aux données et en général une facilité d'écriture.De ce point de vue je trouve qu'un LOO est meilleur qu'un langage impératif.

Ah, mais là, tu ne parles plus de langage fonctionnel...

   Cela dit, en ce qui concerne la comparaison entre orienté objet et impératif, je te rejoins, même si je pense qu'on ne peut pas se contenter de dire qu'orienté objet c'est mieux qu'impératif.

   Le problème de l'impératif, par comparaison à l'orienté objet, au fonctionnel ou à la programmation logique, c'est que les langages sont apparus sans réelle théorisation du paradigme --- à peine la notion de calculabilité de Turing. Du coup, on voit apparaitre les inconvénients d'une absence de formalisme, dans une activité (la programmation) qui au contraire appel un formalisme fort : tout est laissé à la charge du programmeur, qui peu aussi bien produire un code bancal qu'un code propre et robuste. Mais je m'égare...

   À bientôt.

                                                                                                                                            Le Farfadet Spatial

Hors ligne

#74 Le 04/11/2007, à 01:17

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Le Farfadet Spatial a écrit :

Salut à tous !

(...)

Le problème de l'impératif, par comparaison à l'orienté objet, au fonctionnel ou à la programmation logique, c'est que les langages sont apparus sans réelle théorisation du paradigme --- à peine la notion de calculabilité de Turing. Du coup, on voit apparaitre les inconvénients d'une absence de formalisme, dans une activité (la programmation) qui au contraire appel un formalisme fort : tout est laissé à la charge du programmeur, qui peu aussi bien produire un code bancal qu'un code propre et robuste. Mais je m'égare...

   À bientôt.

                                                                                                                                            Le Farfadet Spatial

Je n'ai pas compris un seul mot de ton message big_smile

En tout cas, merci Link31 pour tes éclaircissements sur le heap ! Quand tu dis ceci :

La première forme te permet d'allouer de la mémoire sur le tas, et accessoirement de ne pas créer d'instance avant d'en avoir réellement besoin (utile dans le cas de membres d'une classe, il arrive qu'on ne veuille pas que tout soit construit automatiquement à la création).

Tu veux dire que déclarer une instance de ubuntero (enfin un pointeur) de cette façon n'occupe pas de mémoire ? Si ça occupe de la mémoire dans le heap plutôt que la pile, c'est alloué point barre. Non ?

En gros je comprends qu'on décharge la pile au détriment du heap mais c'est avant tout une instance qu'on crée en tapant ubuntero* pmembre = new ubuntero;
Preuve est qu'on peut l'utiliser après comme une instance. Du moins il me semble (tout ça est très frais dans ma tête). Et qu'il faut libérer l'espace alloué avec la commande delete.
Au fait, pourquoi ce p revient souvent au début du libellé des instances crées de cette façon ?
p comme pointer ? Cette méthode de construction a un nom ?

Merci smile

Dernière modification par aganim07 (Le 04/11/2007, à 01:19)

Hors ligne

#75 Le 04/11/2007, à 01:29

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

aganim07 a écrit :

Tu veux dire que déclarer une instance de ubuntero (enfin un pointeur) de cette façon n'occupe pas de mémoire ? Si ça occupe de la mémoire dans le heap plutôt que la pile, c'est alloué point barre. Non ?

Ce que je veux dire, c'est qu'avant d'utiliser "new" pour créer une instance, le constructeur de la classe n'a pas été appelé. Ça permet de "différer" la construction de l'objet. Sous la forme d'une variable normale, il aurait été créé au début du constructeur de la classe, mais sous la forme d'un pointeur, ça permet de faire quelques petits réglages avant de le créer.
Enfin, ce n'est pas le but de "new" et il y a toujours moyen de faire autrement, c'est juste quelque chose qui peut éviter des situations assez compliquées.

aganim07 a écrit :

En gros je comprends qu'on décharge la pile au détriment du heap mais c'est avant tout une instance qu'on crée en tapant ubuntero* pmembre = new ubuntero;
Preuve est qu'on peut l'utiliser après comme une instance. Du moins il me semble (tout ça est très frais dans ma tête). Et qu'il faut libérer l'espace alloué avec la commande delete.

Oui.

aganim07 a écrit :

Au fait, pourquoi ce p revient souvent au début du libellé des instances crées de cette façon ?
p comme pointer ? Cette méthode de construction a un nom ?

Quelque chose comme la "notation hongroise", c'est comme ça qu'ils codent chez Microsoft (mais en pire). N'hésite pas à ajouter un p si ça peut t'aider à te rappeler que c'est un pointeur, mais il ne faut pas tomber dans l'excès. Chez Microsoft, pour nommer un tableau de pointeurs de "ubuntero" ils utiliseraient quelque chose comme ça : tblpUb. Autant dire que ça devient rapidement illisible...

Hors ligne