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 :

Pointeurs mais quel malheur!


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 12
    Points
    12
    Par défaut Pointeurs mais quel malheur!
    Hello!
    me revoici me revoilà ( je promet participer dans le forum et rendre un peu de ce que vous me donnez <3 )
    Alors voici mon soucis:
    j'ai deux classes: Ressort et Masse. Dans Ressort (atributs privés) j'ai deux pointeurs sur des masses et dans Masse j'ai un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Ressort>* EnsRes;
    ensemble de ressorts. Cela semble un peu compliqué je sais mais ce n'est pas là où j'ai besoin d'aide (ne tentez pas de me faire changer d'avis sur cette implémentation car ça ne dépend pas de moi )

    j'ai donc une surcharge d'opérateur<< comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ostream& operator<<(ostream& sortie, Masse  m){
     
    sortie<< "Masse : "<<m.masse<<endl;
    sortie<< "Position : "<<m.position<<endl;
    sortie<< "Vitesse : "<<m.vitesse<<endl;
    sortie<< "Force resultante : "<<m.forceS<<endl;
    sortie<< "Acceleration : "<<m.acceleration()<<endl;
    sortie<< "Coefficient de frottement : "<<m.coefFrott<<endl;
    sortie<< "nb de ressorts : "<<m->EnsRes.size()<<endl;
     
    return sortie;
    Et j’obtiens l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /home/XXXX/Documents/Vecteurs3D/src/Masse.cpp|71|error: base operand of ‘->’ has non-pointer type ‘Masse’|
    je suis vraiment bloqué sur ça... Je comprends les pointeurs mais un tableau d'une classe avec des pointeurs et tout et tout ça devient un peu trop XD. Merci d'avance!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Ton design montre une énorme faille de conception.

    Les classes doivent, en générale, être les plus indépendantes possibles.
    Maintenant, peux-tu utiliser la classe Ressort sans la classe Masse ?
    Peux-tu utiliser la classe Masse sans la classe Ressort ?
    FAIL

    On va dire que ton prof. mérite des coups de pieds au cul si c'est lui qui vous impose ce truc.

    Ton architecture montre un je-m’en-foutisme complet de qui est propriétaire de qui (qui appelle le delete/destructeur des objets pointées ?) => crashs et fuites mémoire à gogo.

    On utilise rarement des pointeurs nus, on leur préfère très souvent les pointeurs intelligents (pour gérer la "propriété" des objets pointés, par exemple).

    Cela semble un peu compliqué je sais
    Non, c'est le cas classique de l'erreur de conception signalée plus haut.

    ne tentez pas de me faire changer d'avis sur cette implémentation car ça ne dépend pas de moi
    Si c'est ton prof., on peut lui faire entendre raison.

    je suis vraiment bloqué sur ça..
    Ouaf!!! t'es pas très doué au jeu des 7 différences.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sortie<< "Coefficient de frottement : "<<m.coefFrott<<endl;
    sortie<< "nb de ressorts : "<<m->EnsRes.size()<<endl;
    to "m." or not to "m->", this is the question.

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Bonjour,
    Un petit ajout, s'il te plait définit plutôt l'opérateur de décalage par :
    ostream& operator<<(ostream& sortie, const Masse &m) { ....

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    Euh oui on peut créer et utiliser les instances des différentes classes indépendamment. Deuxièmement, ce sont des objets intimement liés et l'utilisation de pointeur permet justement cela. Je n'adhère pas aux pointeurs intelligents car je ne veux pas qu'on pense à ma place. Et, finalement, les compétences et les decisions de mon professeur ne sont pas à mettre en doute. C'est bien pour cela que j'ai insisté sur le fait que ça ne dépend pas de moi donc quel intérêt à en parler?
    Bienvidemment j'ai essayé avec m.EnsRe.size() et ça ne fonctionne pas non plus.

    Si quelqu'un a une réponse un peu plus instructive à LA question que je pose je le remercie d'avance

    Citation Envoyé par dalfab Voir le message
    Bonjour,
    Un petit ajout, s'il te plait définit plutôt l'opérateur de décalage par :
    ostream& operator<<(ostream& sortie, const Masse &m) { ....
    Non, je ne peux pas le passer par référence constante dans ce cas précis.

  5. #5
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    m.EnsRe->size()Mais un pointeur sur un vecteur c'est, comment dire... louche ?

    Citation Envoyé par DanFire Voir le message
    je n'adhère pas aux pointeurs intelligents car je ne veux pas qu'on pense à ma place.

    Tu devrais coder sans faire de destructeur, le compilateur pense à ta place quand il l'appelle.

    Citation Envoyé par DanFire Voir le message
    Non, je ne peux pas le passer par référence constante dans ce cas précis.
    Pour quelle raison ?
    Si tu peux prendre par copie, alors tu peux prendre par référence constante.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par DanFire Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Ressort>* EnsRes;
    Pourtant c'est un truc bête comme chou

    En attribut tu as un pointeur vers un tableau (de type std::vector) qui contient des instances de Ressort.


    Citation Envoyé par DanFire Voir le message
    Non, je ne peux pas le passer par référence constante dans ce cas précis.
    C'est pour cela que tu as un attribut "pointeur vers un tableau"

    Pour éviter les recopies dudit tableau

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par DanFire Voir le message
    Si qqun a une réponse un peu plus instructive à LA question que je pose je le remercie d'avance
    Parmi ce code moche et les réponses faites, si tu les avais lues, tu y aurais trouvé ta solution. En fait dès la première réponse de bacelar en bas de son post
    sortie<< "nb de ressorts : "<<m->EnsRes.size()<<endl; pourquoi tout à coup tu utilises -> sur m qui n'est pas un pointeur ? Et si tu lis l'erreur, elle indique ligne 71 qui est surement cette ligne. Sauf si tu as la même erreur ailleurs. D'ailleurs deuxième erreur sur la même ligne : ensRes est un pointeur, donc ->

    Enfin, un pointeur de vector dont on ne sait rien de son origine ni quoi que ce soit c'est... au mieux inhabituel, et surement mal amha. A l'inverse un vector de pointeurs serait bienvenu et logique.
    Tout passage par copie peut être remplacé par un const&. Dans ce cas précis - qui n'a absolument rien d'extraordinaire - ou tout autre. Seul exception si ton constructeur de copie et destructeur ont un effet de bord, du genre qui servirait à compter le nombre de fonctions qui appellent un objet en incrémentant un compteur. Bref, ceci oui serait un cas précis et particulier.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 12
    Points
    12
    Par défaut Solution
    Hello,
    donc voilà pour ceux à qui la curiosité démange il s'agissait en effet de faire un vector de pointeurs. De plus, le passage par référence constante n'était pas possible car m.Acceleracion n'était pas définie comme constante.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par DanFire Voir le message
    pas possible car m.Acceleracion n'était pas définie comme constante.
    Ce qui est surement une erreur et un autre problème, un getter non-const est rarement une bonne chose.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    d'où le "était" maintenant elle l'est mais merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/09/2008, 11h06
  2. instruction CONVERT, mais quel code ?
    Par ironfalcon dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/07/2008, 17h40
  3. Vive la programmation ! Mais quel language ?
    Par izandril dans le forum Débuter
    Réponses: 15
    Dernier message: 04/12/2004, 21h19
  4. Mais quel est l'intérêt de XML ?
    Par darkbauer dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 01/06/2004, 18h03
  5. Chaines et pointeurs mais pas "const"
    Par hpfx dans le forum C
    Réponses: 9
    Dernier message: 05/10/2003, 20h23

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