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 :

Problème héritage pour les attributs


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut Problème héritage pour les attributs
    Bonjour

    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
    26
    class Matrice
    {
        protected:
     
            typedef float *ligne;
            ligne *matrice; // données de la matrice
            int nbLig; // Nombre de lignes de la matrice
            int nbCol; // Nombre de colonnes de la matrice
    ...
    }
     
    class Vecteur : public Matrice
    {
    ...
    }
     
    Vecteur Vecteur::operator*(const Matrice &mat)
    {
        Vecteur ret;
     
        ret.x = mat.matrice[0][0]*x + mat.matrice[0][1]*y + mat.matrice[0][2]*z + mat.matrice[0][3];
        ret.y = mat.matrice[1][0]*x + mat.matrice[1][1]*y + mat.matrice[1][2]*z + mat.matrice[1][3];
        ret.z = mat.matrice[2][0]*x + mat.matrice[2][1]*y + mat.matrice[2][2]*z + mat.matrice[2][3];
     
        return ret;
    }


    Le compilateur me dit que je ne peux pas accéder à l'attribut matrice (qui correspond aux éléments de ma matrice) alors que je l'ai mis en protected et que j'ai fait un héritage..
    Je ne comprends pas le problème, merci de bien vouloir m'aider.

  2. #2
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Salut,

    Dans ta fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vecteur Vecteur::operator*(const Matrice &mat)
    mat est marquée comme const. Tu ne peux donc pas accéder à ses attributs comme tu le fais excepté si tu les rends "mutable" ou si tu supprimes le const de l'argument de ta fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mutable ligne *matrice;
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vecteur Vecteur::operator*(Matrice &mat)
    Flo.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Merci çà fonctionne!!
    Mais je viens de remarquer que ma fonction va retourner une matrice! =)

  4. #4
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Attention, parce que mes 2 solutions ne sont peut-être pas bonnes d'un point de vue philosophie. Effectivement dans ta fonction, il est logique de mettre mat en const puisqu'elle n'est pas modifiée. Et mettre ses attributs en mutable n'est pas également une solution.

    La bonne (et troisième) solution à mon avis serait de proposer une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const double Matrice::get(const unsigned int & i, const unsigned int & j) const 
    {
        return matrice[i][j];
    }
    que tu pourrais utiliser comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Vecteur Vecteur::operator*(const Matrice &mat)
    {
        Vecteur ret;
     
        ret.x = mat.get(0,0)*x + mat.get(0,1)*y + mat.get(0,2)*z + mat.get(0,3);
        ret.y = mat.get(1,0)*x + mat.get(1,1)*y + mat.get(1,2)*z + mat.get(1,3);
        ret.z = mat.get(2,0)*x + mat.get(2,1)*y + mat.get(2,2)*z + mat.get(2,3);
     
        return ret;
    }
    Flo.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Merci!
    En effet je pense que c'est plus correcte.
    Néanmoins j'ai toujours deux erreurs :

    - pour cette ligne : Vecteur operator*(const Matrice &);

    ISO C++ forbids declaration of `Matrice' with no type

    expected ',' or '...' before '&' token

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    En fait, je suis dans la classe vecteur et le produit d'un vecteur par une matrice me retourne une matrice normalement donc çà va pas.

    Comment puis-je faire pour implémenter une méthode permettant de multiplier une matrice par un vecteur dans ma classe Vecteur?
    Je suis obligé de mettre deux paramètres nan? Mais pour une surcharge il ne faut pas même je crois qu'on ne peut pas..

    Merci de bien m'aider

    Vecteur Vecteur::operator*(const Vecteur &vect, const Matrice &mat) serait une idiotie je crois mais je ne vois pas comment faire..

  7. #7
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Tu définis une fonction libre, c'est à dire non membre de Matrice ou de Vecteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Matrice
    {
    };
     
    class Vecteur : public Matrice
    {
    };
     
    Matrice operator * (const Vecteur & vect, const Matrice & mat)
    {
    }
    Flo.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    D'accord merci =)
    Mais je définis cette fonction dans une classe qui hérite de Matrice et Vecteur?

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Ta fonction ne va pas plutôt faire la multiplication d'une matrice par un vecteur et par une autre matrice?

  10. #10
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    La fonction suivante par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Vecteur operator * (const Matrice & mat, const Vecteur & vect)
    {
        const double x = mat.get(0,0)*vect.getX() + mat.get(0,1)*vect.getY() + mat.get(0,2)*vect.getZ() + mat.get(0,3);
        const double y = mat.get(1,0)*vect.getX() + mat.get(1,1)*vect.getY() + mat.get(1,2)*vect.getZ() + mat.get(1,3);
        const double z = mat.get(2,0)*vect.getX() + mat.get(2,1)*vect.getY() + mat.get(2,2)*vect.getZ() + mat.get(2,3);
     
        return Vecteur(x, y, z);
    }
    (en supposant que la classe Vecteur possède un constructeur qui initialize x, y, et z possède également des accesseurs getX, getY et getZ qui retournent x, y et z)

    s'utilise de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Matrice matrice;
    Vecteur vecteur;
    Vecteur vecteur_resultat = matrice * vecteur;
    Elle est déclarée et définie en dehors d'une quelconque classe. Le mieux est quand même de la définir dans un namespace.

    Flo.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Très bien je vous remercie beaucoup, donc je peux la déclarer dans une classe quelconque c'est bien cela?

    Le hic est que le compilateur me dit que la fonction ne peut avoir que 0 ou 1 argument... C'est logique vu que c'est une fonction de surcharge d'opérateur.
    C'était à mon soucis :/

  12. #12
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Non !

    La fonction dont je te parle dans mon précédent post est une fonction libre. Tu la déclares comme une fonction libre, n'appartenant à aucune classe. Elle flotte dans l'air tel un papillon virevoltant dans les airs.

    Comme dans mon exemple précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Matrice
    {
    };
     
    class Vecteur : public Matrice
    {
    };
     
    Matrice operator * (const Vecteur & vect, const Matrice & mat)
    {
    }
    http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

    Flo.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Oui mais concrètement je la déclare où?!

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Vecteur vecteur_resultat = matrice * vecteur;

    Le compilateur me dit aussi qu'il faut que je surcharge l'opérateur '='

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    De plus je ne sais pas comment on définit une fonction dans un namespace.
    Please!!

  16. #16
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Je dois mal m'exprimer. Ou alors je suis à côté de la plaque.

    Par exemple

    Matrice.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef MATRICE_H
    #define MATRICE_H
     
    namespace MySpace
    {
         class Matrice
         {
         };
    }
     
    #endif // MATRICE_H
    Vecteur.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef VECTEUR_H
    #define VECTEUR_H
     
    #include "Matrice.h"
     
    namespace MySpace
    {
         class Vecteur : public Matrice
         {
         };
    }
     
    #endif // VECTEUR_H

    Operations.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef OPERATIONS_H
    #define OPERATIONS_H
     
    #include "Matrice.h"
    #include "Vecteur.h"
     
    namespace MySpace
    {
         Matrice operator * (const Vecteur & vect, const Matrice & mat)
         {
         }
    }
     
    #endif // OPERATIONS_H
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "Matrice.h"
    #include "Vecteur.h"
    #include "Operations.h"
     
    int main()
    {
         MySpace::Matrice matrice;
         MySpace::Vecteur vecteur;
         MySpace::Vecteur vecteur_resultat = matrice * vecteur;
    }
    Flo.

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Très bizarre cette implémentation.
    N'y a t-il pas une autre solution?

  18. #18
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par fab87 Voir le message
    Très bizarre cette implémentation.
    Pourquoi ?

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Parce qu'on est obligé de mettre myspace à chaque fois... c'est redondant.

  20. #20
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Si ce n'est que ça, tu peux faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "Matrice.h"
    #include "Vecteur.h"
    #include "Operations.h"
     
    int main()
    {
         using namespace MySpace;
         Matrice matrice;
         Vecteur vecteur;
         Vecteur vecteur_resultat = matrice * vecteur;
    }
    Flo.

Discussions similaires

  1. [XSD] Equivalent du <choice> pour les attribut
    Par BigOne55 dans le forum Valider
    Réponses: 6
    Dernier message: 14/03/2014, 19h24
  2. [XSD] Problème de vérification de choix pour les attributs
    Par yeti47 dans le forum Valider
    Réponses: 2
    Dernier message: 16/01/2012, 22h43
  3. Réponses: 1
    Dernier message: 08/02/2009, 15h43
  4. Réponses: 2
    Dernier message: 14/06/2006, 10h34
  5. Réponses: 7
    Dernier message: 13/02/2006, 17h13

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