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 :

Passer une classe en paramètre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut Passer une classe en paramètre
    Bonjour,
    j'ai un problème de passage de Classe en paramètre.

    J'ai une classe CVecteur3d et une classe CPoint. Je voudrait mettre un constructeur dans CVecteur3d qui construit cette classe à partir de la classe point.

    Je me suis inspiré de ça
    http://c.developpez.com/faq/cpp/?pag...sage_parametre

    mais mon code ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	CVecteur3d();
    	CVecteur3d(float x, float y, float z);
    	CVecteur3d(const CPoint &p);


    merci pour votre aide.

  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 Re: Passer une classe en paramètre
    salut,
    Citation Envoyé par Tex-Twil
    mais mon code ne marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	CVecteur3d();
    	CVecteur3d(float x, float y, float z);
    	CVecteur3d(const CPoint &p);
    y a pas de code ici ! que des déclarations.
    Si tu veux qu'on t'aide, montres-en plus

  3. #3
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    oui parce que c'est la déclaration qui ne marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    e:\FAC - MASTER\INFOGRAPHIE\RayTraceVisual\CVecteur3d.h(20): error C2226: syntax error : unexpected type 'CVecteur3d'
    e:\FAC - MASTER\INFOGRAPHIE\RayTraceVisual\CVecteur3d.h(20): error C2238: unexpected token(s) preceding ';'

  4. #4
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Salut,

    jmv a raison il en faut plus si tu veux de l'aide on ne peux rien dire a partir de si peu d'information. Montre la declaration complete de ta classe CVecteur3d.

    XXiemeciel

  5. #5
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    ok justement je ne voulais pas trop en mettre pour vous éviter de tout lire.
    Voici le .h

    Point
    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
     
    #ifndef _CPoint_
    #define _CPoint_
     
    #include "CVecteur3d.h"
    class CPoint
    {
    public:
    	float x, y, z;
     
    	CPoint();
    	CPoint(float x, float y, float z);
     
    	void operator = (CPoint p);
    	CPoint operator + (CPoint &p);
    	CPoint operator - (CPoint &p);
     
    };
     
    #endif
    et Vecteur:

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    #ifndef _CVecteur3d_
    #define _CVecteur3d_
     
    #include "CPoint.h"
     
    class CVecteur3d
    {
    private:
    	float x,y,z;
    	float norme;
     
    	// Norme du vecteur
    	void setNorme();
    	void normalizer();
    public:
     
    	CVecteur3d();
    	CVecteur3d(float x, float y, float z);
    	//CVecteur3d(const CPoint &p);
     
    	/* Get - Set */
    	void setXYZ(float x, float y, float z);
    	void setX(float x);
    	void setY(float y);
    	void setZ(float z);
     
    	float getX();
    	float getY();
    	float getZ();
     
    	void afficherConsole();
    };
    #endif
    et le constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CVecteur3d::CVecteur3d(const CPoint &p)
    {
    	this->setX(p.x);
    	this->setY(p.y);
    	this->setZ(p.z);
    }

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    C'est innopportum d'inclure "CVecteur3d.h" dans CPoint.h

  7. #7
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut


    Je sais pas ce que ça faisait ici mais en tout cas le probleme venait de cette inclusion !!!!

    merci

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    Un petit Tag résolu. Et hop c'est emballé !

  9. #9
    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
    tu n'as pas besoin d'inclure CVecteur3d.h dans CPoint.h (surtout que celui-ci inclu à son tout CVecteur3d.h)

    l' operator=() de la classe CPoint me paraît inutile, celui par défaut ne convient pas ?

    Dans CVecteur3d.h, tu peux, au lieu d'include CPoint.h, faire une déclaration anticipée de ta classe.et un conseil : ne stocke pas la norme, c'est une information redondante que tu va être obligé de mettre à jour sans cesse.

    [edit] j'arrive trop tard [/edit]

  10. #10
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    ok merci pour les conseils.

    Quel est l'avantage de faire une déclaration anticipée de la classe CPoint ?

  11. #11
    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
    Citation Envoyé par Tex-Twil
    Quel est l'avantage de faire une déclaration anticipée de la classe CPoint ?
    éviter une inclusion, c'est tout.

    Mais ça ne marche que si tu utilise uniquement des pointeurs ou références
    sur CPoint.

  12. #12
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    j'ai un autre problème avec ce constructeur: quand j'essaye de lui passer un CPoint en paramètre il y a une erreur à la compilation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    bool CSphere::estIntercepte(CRayon r)
    {
    	bool touche;
    	CPoint p ; 
    	CVecteur3d vect(p);
     
    	return touche;
    }
    Erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RayTraceVisual fatal error LNK1120: 1 unresolved externals

    .. je ne suis pas habitué aux passages par références

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    Un résumé de la situation et de ton code source ou de la solution que tu as adoptée serait interessannt à ce stade.

  14. #14
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    ok. Je travaille sur un projet de Lancé de Rayon (Ray Trace)

    A ce stade de projet, je suis en train de calculer si il y a ou non l'intersection entre un rayon et une sphere.

    Un Rayon est caracterisé par un point de départ et un vecteur de direction. Le code ci dessus et le commencement de la méthode de la classe CSphere qui doit dire si un rayon touche cette sphère.

    Mais même si j'essaye d'instancier un vecteur avec un point dans le main j'ai la même erreur. Il se trouve aussi que je pourrais très bien m'en passer de ce constructeur prenant un point comme paramètre mais j'aimerais quand même réussir à trouver d'où vient l'erreur.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    Il n'y a pas de raison que ca ne marche pas. Mais voici des pistes possibles.

    - je vois 3 declarations constructeurs pour CPoint. le conctructeur par défaut que tu utilise a t-il été implémenté ?

    - les paramètres du constructeur CPoint(float x, float y, float z) ne sont pas bien choisis: préférer d'autres noms différents de x,y,z

    -Enfin, concernant le passage par référence, etant donné que la référence en paramètre est constante, les methodes CPoint:: utilisées doivent aussi êtres accessibles aux objets de type constant

  16. #16
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    oui le constructeur par défaut est implémenté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CPoint::CPoint()
    {
    	this->x = 0;
    	this->y = 0;
    	this->z = 0;
    }
    Meme si j'utilise un autre constructeur, l'erreur est la meme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main()
    {
    	CPoint p(1.0, 1.0, 1.0) ;   //= pos - r.getDepart();
    	CVecteur3d vect(p);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    RayTraceVisual error LNK2019: unresolved external symbol "public: __thiscall CVecteur3d::CVecteur3d(class CPoint const &)" (??0CVecteur3d@@QAE@ABVCPoint@@@Z) referenced in function _main
     
    RayTraceVisual fatal error LNK1120: 1 unresolved externals
    Pourquoi ne pas utiliser x y z comme params du constructeur ? je differencie bien les paramètre des attributs de la classe en les appelant
    this->x, this->y ...

    Je ne suis pas sur de comprendre ton dernier point [/code]

  17. #17
    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
    L'erreur semble claire : l'éditeur de lien ne trouve pas le corps de ton constructeur de CVector3d prenant un point.

  18. #18
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    shame on me !!!

    J'avais laissé le corps en commentaire, ha ha.

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

Discussions similaires

  1. [Débutant]Passer une classe abstraite en paramètre
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 06/01/2006, 17h56
  2. Réponses: 1
    Dernier message: 15/04/2005, 11h30
  3. [Conception] Passer une fonction en paramètre
    Par pejay dans le forum Langage
    Réponses: 9
    Dernier message: 09/12/2004, 13h58
  4. [C#][WebServices] Appel methode avec une classe en paramètre
    Par bran_noz dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2004, 16h41
  5. Passer une procédure en paramètre ?
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 24/10/2003, 12h21

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