IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

que pensez vous de ma classe Matrice?


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut que pensez vous de ma classe Matrice?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Matrice
    {
    Matrice(int largeur, int hauteur);
    public:
    Matrice():maLargeur(0),maHauteur(0){}
    int maLargeur;
    int maHauteur;
     
    };
     
    Matrice::Matrice(int largeur, int hauteur):maLargeur(largeur),maHauteur(hauteur){} 
     
    int main()
    {
     Matrice M;
     M.maHauteur=10;
     M.maLargeur=20;
     
    }
    J'ai une petite question: quelle est la différence
    entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Matrice(int largeur, int hauteur);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Matrice():maLargeur(0),maHauteur(0){}
    Pour moi, c'est le constructeur par défaut, mais pourquoi on ne peut pas
    le mettre a l'extérieur du corps de la classe, comme l'autre constructeur?
    Merci

  2. #2
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    hello,
    3 remarques sur ta matrice :
    Où sont stockées les données ? je suppose que ta classe n'est pas finie.
    Ton premier constructeur n'est pas en "public" !!! pourquoi ?
    Les attributs sont en "public", c'est à éviter.

    Pour répondre à ta question tu peux trés bien définir les 2 constructeurs (ou n'importe quelle autre méthode) à l'intérieure (dans le .h) ou à l'extérieure de la déclaration de la clesse (dans le .cpp).
    Pour des méthodes très courtes, on préfère le faire à l'intérieur, ce qui rendra la méthode "inline". Pour les méthodes dont le code est assez long, on préfère le faire à l'extérieur.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    ce qui rendra la méthode "online"
    Pratique, on peut l'appeler depuis internet

  4. #4
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    oups je corrige

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Pour des méthodes très courtes, on préfère le faire à l'intérieur, ce qui rendra la méthode "inline"
    qu'est ce que cela signifie qu'une methode ou fonction soit inline?merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Avril 2008
    Messages : 20
    Par défaut
    Salut,

    Avec une fonction inline le code de la fonction est directement inséré dans le code principal au moment de l'appel (comme pour la directive #include par exemple). Ca permet un accès direct (sans passer par des branchements) et normalement plus rapide au traitement de la fonction en question.

    http://cpp.developpez.com/faq/cpp/?page=inline

  7. #7
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par deubelte Voir le message
    que pensez vous de ma classe Matrice?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Matrice
    {
    Matrice(int largeur, int hauteur);
    public:
    Matrice():maLargeur(0),maHauteur(0){}
    int maLargeur;
    int maHauteur;
     
    };
    Sans vouloir être cruel: que du mal. Sans compter que ce n'est qu'une classe vide pour l'instant.
    Mais réécrivons le peu qui existe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    class matrice 
    {
    // les données sont privée - ce n'est pas une bonne idée de les 
    // mettre publiques - n'importe qui pourrait les modifier de l'extérieur.
    private:
        // 1) unsigned car les dimensions sont toujours positive
        // autant éviter les problèmes à la source.
        // 2) une matrice est fait de N lignes de P colonnes. 
        // elle n'a pas de hauteur ni de largeur (c'est une vue 
        // de l'esprit). On ne parle jamais de matrice de 
        // largeur L... 
        // m_ pour signifier "membre". C'est facultatif. un prefixe
        // "ma" fonctionne très bien aussi. 
        unsigned int m_colonnes;
        unsigned int m_lignes;
    public:
        // les constructeurs sont publics tous les deux
        // vu leur complexité, on préfère les spécifier (=définir)
        // entièrement au moment de leur déclaration. 
        matrice() : m_colonnes(0), m_lignes(0) { }
        matrice(unsigned int cols, unsigned int lignes) : 
            m_colonnes(cols), m_lignes(lignes)
        { }
    };
    Mais dans l'idée, il est encore mieux de passer par des templates que par une classe dont les arguments sont dynamiques. On peut ainsi vérifier des règles mathématiques complexes au moment de la compilation, et non pas à l'exécution (donc un certain nombre de bugs ne peuvent plus se produire). Cependant, les templates sont peut être un concept un peu trop avancé pour toi pour le moment.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  8. #8
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Merci pour les infos

    // les constructeurs sont publics tous les deux
    // vu leur complexité, on préfère les spécifier (=définir)
    // entièrement au moment de leur déclaration
    Qu'est ce que cela change?

    Ensuite, voici ce que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double &Matrice::operator()(int x, int y)
    {  return mesDonnees[x + largeur * y];
    }
    Apres plusieurs essais, j'ai vu quil fallait mettre un & devant Matrice. Je ne comprends pas pourquoi il faut mettre un &. Cela voudrait dire que quand on fait M(1,1)=2 par exemple, M est un pointeur si je ne m'abuse pas.

  9. #9
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Qu'est ce que cela change?
    En déclarant directement le corps des fonctions dans la déclaration de la classe tu as plus de chance qu'elles soient mis en ligne (inline).

    Apres plusieurs essais, j'ai vu quil fallait mettre un & devant Matrice. Je ne comprends pas pourquoi il faut mettre un &. Cela voudrait dire que quand on fait M(1,1)=2 par exemple, M est un pointeur si je ne m'abuse pas.
    Le & signifie que tu renvois la valeur (un double) en tant que référence. Renvoyer par référence permet (comme avec les pointeurs), d'éviter de copier l'objet. Toutefois, avec des doubles, c'est pas la peine d'utiliser des références, tu peux effectuer directement une copie de l'objet (donc enlever le &). D'ailleurs, tu devrais renvoyer une référence constante. Si je me souviens bien (ça fait longtemps que j'ai pas fait du C++ pur :d), si tu modifies la variable de retour (donc une référence), tu vas également modifier la valeur contenue dans ta classe.

    Par exemple, si on utilises ton code, et que tu récupères la valeur comme ceci :

    double & val = maMatrice (1, 1); // Ici, val == 1.0 par ex
    val = ++val; // val == 2.0

    Et bien tu auras implicitement changé la valeur de maMatrice(1,1). Alors que avec la copie, seul val vaudra 2, mais pas la valeur contenue dans la classe.

  10. #10
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    Par défaut
    L'opérateur d'indexation peut/doit aussi permettre de modifier le contenu de la matrice ! Il convient en général d'écrire deux surcharges de l'opérateur d'indexation : un en lecture, qui renvoie par valeur ou par référence constante, et qui est const, et un autre en écriture, qui renvoie une référence. Mais tout ceci est expliqué plus en détail dans la FAQ.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. que pensez-vous de ma classe?
    Par noctua dans le forum C++
    Réponses: 4
    Dernier message: 18/08/2011, 20h37
  2. Que pensez-vous de ma classe tableau ?
    Par deubelte dans le forum C++
    Réponses: 18
    Dernier message: 31/12/2009, 18h14
  3. Que pensez-vous des générateurs de doc PHP ?
    Par Nonothehobbit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 64
    Dernier message: 10/07/2007, 10h17
  4. Que pensez vous du nouveau kernel 2.6 ?
    Par GLDavid dans le forum Administration système
    Réponses: 58
    Dernier message: 02/08/2004, 15h45
  5. Que pensez vous du mariage ASP Flash?
    Par tyma dans le forum Flash
    Réponses: 4
    Dernier message: 09/07/2003, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo