[C++]
Résolu/Fermé
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
-
1 août 2007 à 11:54
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 13 août 2007 à 00:30
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 13 août 2007 à 00:30
17 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
1 août 2007 à 14:34
1 août 2007 à 14:34
Salut
Lorsque tu utilises un template, il faut que le compilateur sache de quel Object il s'agit vraiment avant le link. Sinon tu reçois un message d'erreur.
Pourrais-tu mettre ta ligne de code avec l'utilisation du vector stp ?
Cordialement
Lorsque tu utilises un template, il faut que le compilateur sache de quel Object il s'agit vraiment avant le link. Sinon tu reçois un message d'erreur.
Pourrais-tu mettre ta ligne de code avec l'utilisation du vector stp ?
Cordialement
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
2 août 2007 à 20:36
2 août 2007 à 20:36
Tu compiles bien avec g++ et pas gcc (compilateur c++ et non compilateur c) ?
Essaye de compiler ce petit programme :
Ensuite compile avec g++ :
Bonne chance
Essaye de compiler ce petit programme :
#include <vector> #include <iostream> int main(){ std::vector<int> v; v.push_back(1); v.push_back(6); v.push_back(4); v.push_back(5); v.push_back(1); std::vector<int>::const_iterator vit(v.begin()),vend(v.end()); for(;vit!=vend;++vit) std::cout << *vit << ' '; std::cout << std::endl; return 0; }
Ensuite compile avec g++ :
(mando@aldur) (~) $ g++ -W -Wall plop.cpp (mando@aldur) (~) $ ./a.out 1 6 4 5 1
Bonne chance
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
2 août 2007 à 20:47
2 août 2007 à 20:47
J'utilise visual C++ et je compile bien en c++.Enfin je pense^^.
J'ai fait on programme et il me le compile bien et l'exécute parfaitement il donne comme résultats 1 6 4 5 1
J'ai fait on programme et il me le compile bien et l'exécute parfaitement il donne comme résultats 1 6 4 5 1
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
>
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
2 août 2007 à 21:49
2 août 2007 à 21:49
Salut
Ton erreur vient du template que tu initialises avec Object.
Tu peux pas mettre un type prédéfinie comme int ou autre ? Sinon tu vas devoir utiliser typedef pour forcer le linker a crée le code correspondant. En gros, le compilateur ne connait pas vector<Object> au linkage, il faut que tu le spécialises. Par exemple vector<int>.
Cordialement
Ton erreur vient du template que tu initialises avec Object.
Tu peux pas mettre un type prédéfinie comme int ou autre ? Sinon tu vas devoir utiliser typedef pour forcer le linker a crée le code correspondant. En gros, le compilateur ne connait pas vector<Object> au linkage, il faut que tu le spécialises. Par exemple vector<int>.
Cordialement
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
2 août 2007 à 22:36
2 août 2007 à 22:36
Non je ne peux pas utiliser un type prédéfini car je veux faire un vector de ma classe 'objet'.
Tu pourrais expliqué plus en détails la solution du typedef s'il te plait?
Je dois faire
Tu pourrais expliqué plus en détails la solution du typedef s'il te plait?
Je dois faire
typedef class objet objet;?
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
3 août 2007 à 01:47
3 août 2007 à 01:47
En fait elle est ou ta classe Objet ? parce que sans elle ta classe Jeu ne peut pas compiler.
Tu peux tout à fait mettre une classe définie par tes soins dans un vector ça ne pose aucun problème du moment que cette classe est définie. Tu peux même imbriquer plusieurs conteneurs de la STL les uns dans les autres.
Quelques rappels sur les templates
Il faut bien comprendre qu'en C++ un template n'est qu'une facilité d'écriture : concrètement le compilateur compile chaque classe template de type différent. Par exemple supposons que j'écrive une classe my_vector dépendant d'un paramètre template T (les objets contenus dans le vector, pas forcément d'un type de base). Peuvent dépendre d'un paramètre template
- les classes
- les structures
- les fonctions
- les opérateurs
Si j'utilise my_vector<int> et un my_vector<plop_t>, je compilerai la classe my_vector<int> et la classe my_vector<plop>.
Bien entendu, je ne peux pas précompiler d'avance toutes les classes qui decouleront de my_vector, et c'est pour cela qu'une classe template ne se compile pas (le compilateur compile ce dont il a besoin au fur et à mesure).
Ainsi une classe template n'a pas de ".cpp" tout est défini dans le ".hpp", en tout cas si tu veux l'utiliser dans un autre fichier que celui ou tu délcares ta classe template. De plus supposons que j'ai un typedef défini à l'intérieur de ma classe. Ce typedef dépend du paramètre template (ici T) donc je ne peut pas l'utiliser directement car ce type n'est pas résolu au moment ou je déclare ma classe. Typiquement my_vector<int>::const_iterator et my_vector<plop_t> sont deux types différents. Pour que ce soit plus concret on va revenir à des vector standards :
Ici le mot clé typename permet d'accéder au typedef "const_iterator", car std::vector est un type non résolu dans cette fonction (il dépend de T). Pour faire simple, qui dit opérateur :: derrière un type dépendant de paramètre template dit typename. Tu peux bien sûr faire des classes, des operateurs et des fonctions qui dépendent de plusieurs paramètres template. Exemple :
Quelques exemples
Pour mettre en pratique ce qu'on vient de voir voici deux petits exemple. A noter que la STL propose une classe std::pair qui fait grosso modo la même chose que la classe my_pair de l'exemple 2.
Exemple 1 :
Dans ton cas pour peu que la class Objet soit définie, le type std::vector<Objet> est parfaitement résolu. Pas besoin de typename donc (et encore moins de typedef qui ne servent de toute façon qu'à renommer).
Donne :
Note qu'ici un plop_t est une structure, mais on peut définir un std::vector pour une class, une struct, un type de base (char, int...) etc.
Exemple 2 :
Pour voir un peu comment utiliser les templates :
ce qui nous donne :
Je sais pas si c'est clair, mais n'hésite pas à demander des précisions si tu en as besoin.
Bonne chance
Tu peux tout à fait mettre une classe définie par tes soins dans un vector ça ne pose aucun problème du moment que cette classe est définie. Tu peux même imbriquer plusieurs conteneurs de la STL les uns dans les autres.
Quelques rappels sur les templates
Il faut bien comprendre qu'en C++ un template n'est qu'une facilité d'écriture : concrètement le compilateur compile chaque classe template de type différent. Par exemple supposons que j'écrive une classe my_vector dépendant d'un paramètre template T (les objets contenus dans le vector, pas forcément d'un type de base). Peuvent dépendre d'un paramètre template
- les classes
- les structures
- les fonctions
- les opérateurs
template <typename T> class my_vector{ protected: T * datas; public: typedef const T * const_iterator; typedef const T * iterator; my_vector(){} //... };
Si j'utilise my_vector<int> et un my_vector<plop_t>, je compilerai la classe my_vector<int> et la classe my_vector<plop>.
Bien entendu, je ne peux pas précompiler d'avance toutes les classes qui decouleront de my_vector, et c'est pour cela qu'une classe template ne se compile pas (le compilateur compile ce dont il a besoin au fur et à mesure).
Ainsi une classe template n'a pas de ".cpp" tout est défini dans le ".hpp", en tout cas si tu veux l'utiliser dans un autre fichier que celui ou tu délcares ta classe template. De plus supposons que j'ai un typedef défini à l'intérieur de ma classe. Ce typedef dépend du paramètre template (ici T) donc je ne peut pas l'utiliser directement car ce type n'est pas résolu au moment ou je déclare ma classe. Typiquement my_vector<int>::const_iterator et my_vector<plop_t> sont deux types différents. Pour que ce soit plus concret on va revenir à des vector standards :
template <typename T> void write(std::vector<T> & v){ typename std::vector<T>::const_iterator vit(v.begin()),vend(v.end()); for(;vit!=vend;++vit) std::cout << *vit << ' '; std::cout << std::endl; }
Ici le mot clé typename permet d'accéder au typedef "const_iterator", car std::vector est un type non résolu dans cette fonction (il dépend de T). Pour faire simple, qui dit opérateur :: derrière un type dépendant de paramètre template dit typename. Tu peux bien sûr faire des classes, des operateurs et des fonctions qui dépendent de plusieurs paramètres template. Exemple :
template <typename Tstream,typename T> Tstream & operator<<(Tstream & out,const std::vector<T> & v){ typename std::vector<T>::const_iterator vit(v.begin()),vend(v.end()); for(;vit!=vend;++vit) out << *vit << ' '; out << std::endl; return out; }
Quelques exemples
Pour mettre en pratique ce qu'on vient de voir voici deux petits exemple. A noter que la STL propose une classe std::pair qui fait grosso modo la même chose que la classe my_pair de l'exemple 2.
Exemple 1 :
Dans ton cas pour peu que la class Objet soit définie, le type std::vector<Objet> est parfaitement résolu. Pas besoin de typename donc (et encore moins de typedef qui ne servent de toute façon qu'à renommer).
#include <iostream> #include <vector> struct plop_t{ char x; float y; plop_t(){} plop_t(char x0,float y0):x(x0),y(y0){} }; std::ostream & operator<<(std::ostream & out,const plop_t & p) { out << '[' << p.x << ',' << p.y << ']'; return out; } class plops_t{ protected: std::vector<plop_t> datas; public: plops_t(){} inline void add(const plop_t & p){ datas.push_back(p); } inline void write() const{ std::vector<plop_t>::const_iterator vit (datas.begin()), vend(datas.end()); for(;vit!=vend;++vit) std::cout << *vit << ' '; std::cout << std::endl; } }; int main(){ plop_t plop1('x',69); plop_t plop2('y',70); plops_t plops; plops.add(plop1); plops.add(plop2); plops.write(); return 0; }
Donne :
(mando@aldur) (~) $ g++ -W -Wall plop.cpp (mando@aldur) (~) $ ./a.out [x,69] [y,70]
Note qu'ici un plop_t est une structure, mais on peut définir un std::vector pour une class, une struct, un type de base (char, int...) etc.
Exemple 2 :
Pour voir un peu comment utiliser les templates :
#include <iostream> //----- template <typename T> class my_pair{ public: T first; T second; my_pair(){} inline my_pair<T> & operator=(const my_pair<T> & src){ this->first = src.first; this->second = src.second; return *this; } }; template <typename T> my_pair<T> my_make_pair(const T & x0,const T & y0){ my_pair<T> p; p.first = x0; p.second = y0; return p; } // Les operateurs peuvent êtres écrits dans ou hors de la classe template <typename Tstream,typename T> Tstream & operator << (Tstream & out,const my_pair<T> & p){ out << '(' << p.first << ',' << p.second << ')'; return out; } //----- struct plop_t{ char x; float y; plop_t(){} plop_t(char x0,float y0):x(x0),y(y0){} inline plop_t & operator=(plop_t src){ x = src.x; // on peut sous entendre le this-> y = src.y; } }; inline std::ostream & operator<<(std::ostream & out,const plop_t & p) { out << '[' << p.x << ',' << p.y << ']'; return out; } //----- int main(){ plop_t p1('x',69); plop_t p2('y',60); my_pair<plop_t> p_plop = my_make_pair(p1,p2); p_plop.first = plop_t('z',63); std::cout << p_plop << std::endl; return 0; }
ce qui nous donne :
(mando@aldur) (~) $ g++ -W -Wall plop.cpp (mando@aldur) (~) $ ./a.out ([z,63],[y,60])
Je sais pas si c'est clair, mais n'hésite pas à demander des précisions si tu en as besoin.
Bonne chance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
3 août 2007 à 09:29
3 août 2007 à 09:29
Merci pour la réponse mais je ne comprends pas pourquoi on me parle de template depuis le début car je n'utilise aucun template dans mon programme.Je sais même pas ce que c'est.Est-ce que j'en ai besoin pour mon programme?
Par contre,je fais bien appel à ma classe objet dans ma classe jeu avec un include "objet.h".
J'avoue j'ai pas tout compris à ta réponse mais je vais voir ce qu'est un template d'abord,ça m'aidera peut-être.
Par contre,je fais bien appel à ma classe objet dans ma classe jeu avec un include "objet.h".
J'avoue j'ai pas tout compris à ta réponse mais je vais voir ce qu'est un template d'abord,ça m'aidera peut-être.
Zempachi
Messages postés
7472
Date d'inscription
vendredi 14 octobre 2005
Statut
Contributeur
Dernière intervention
5 juin 2020
906
3 août 2007 à 09:58
3 août 2007 à 09:58
Salut, juste pour dire que la "class" vector est un template c'est pour cela qu'on t'en parle.
Mais pour revenir à ton pb, il faudrait le code de ta class objet pour faire des vérif.
En effet, l'utilisation de template pour un type(class , typedef...etc) donné nécessite parfois des contraintes au niveau du type en question.
Plus clairement, pour utiliser la class vector avec la class objet, il faut que la class objet possède un constructeur par défaut et un constructeur de recopie (si je me souviens bien... à vérifier) car tout simplement l'implémentation de la class vector fait appel à ces constructeurs dans son code.
Il te faut donc vérifier les pré-requis pour l'utilisation de vector afin de résoudre une partie (pour pas dire tous) tes pbs.
Mais pour revenir à ton pb, il faudrait le code de ta class objet pour faire des vérif.
En effet, l'utilisation de template pour un type(class , typedef...etc) donné nécessite parfois des contraintes au niveau du type en question.
Plus clairement, pour utiliser la class vector avec la class objet, il faut que la class objet possède un constructeur par défaut et un constructeur de recopie (si je me souviens bien... à vérifier) car tout simplement l'implémentation de la class vector fait appel à ces constructeurs dans son code.
Il te faut donc vérifier les pré-requis pour l'utilisation de vector afin de résoudre une partie (pour pas dire tous) tes pbs.
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
3 août 2007 à 10:20
3 août 2007 à 10:20
Merci.Là,c'est tout suite plus clair.
Voici le code de ma classe objet:
Objet.h:
Objet.cpp:
Voici le code de ma classe objet:
Objet.h:
#ifndef H_OBJET #define H_OBJET #include "vecteur.h" #include <windows.h> #include <SDL/SDL.h> #include <GL/gl.h> #include <GL/glu.h> class Objet { private: Vecteur pos, vitdir,taille; public: //constructeur Objet(); //destructeur ~Objet(); //Prendre position objet void SetPos(double,double); //Prendre direction objet void SetDir(double,double); //Prendre taille void SetTaille(double,double); //Prendre vitesse void SetVit(double,double); //donner position double GetX(); double GetY(); //donner direction double GetVX(); double GetVY(); //donner taille double GetW();//W pour largeur double GetH();//H pour hauteur //mise à jour position objet void UpdatePosObjet(); //Affichage objet void Affiche(); }; #endif
Objet.cpp:
#include "define.h" #include "objet.h" Objet::Objet() { pos.set(0,0); vitdir.set(0,0); } Objet::~Objet() { } void Objet::SetPos(double x, double y) { pos.setX(x); pos.setY(y); } void Objet::SetDir(double x,double y) { vitdir.setX(x); vitdir.setY(y); } void Objet::SetTaille(double x, double y) { taille.setX(x); taille.setY(y); } void Objet::SetVit(double x,double y) { } double Objet::GetX() { return pos.getX(); } double Objet::GetY() { return pos.getY(); } double Objet::GetVX() { return vitdir.getX(); } double Objet::GetVY() { return vitdir.getY(); } double Objet::GetW() { return taille.getX(); } double Objet::GetH() { return taille.getY(); } void Objet::UpdatePosObjet() { //Test collision if((GetX()<=0)||(GetX()+GetW()>=LARGEUR)) { SetDir(-GetVX(),GetVY()); } if((GetY()<=0)||(GetY()+GetH()>=HAUTEUR)) { SetDir(GetVX(),-GetVY()); } pos.setX(pos.getX()+vitdir.getX()); pos.setY(pos.getY()+vitdir.getY()); } void Objet::Affiche() { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode( GL_MODELVIEW ); glLoadIdentity( ); //dessin carré glBegin(GL_QUADS); glColor3ub(255,0,0); glVertex2d(GetX(),GetY()); glColor3ub(255,0,0); glVertex2d(GetX()+GetW(),GetY()); glColor3ub(0,0,255); glVertex2d(GetX()+GetW(),GetY()+GetH()); glColor3ub(0,0,255); glVertex2d(GetX(),GetY()+GetH()); glEnd(); glFlush(); SDL_GL_SwapBuffers(); }
Zempachi
Messages postés
7472
Date d'inscription
vendredi 14 octobre 2005
Statut
Contributeur
Dernière intervention
5 juin 2020
906
3 août 2007 à 10:35
3 août 2007 à 10:35
Et bien une première chose est de définir pour ta class objet mais aussi pour ta class Vecteur un constructeur de recopie.
D'abord défini le constructeur de recopie de ta classe Vecteur ce qui te facilitera la tache pour le constructeur de recopie de la class objet.
D'abord défini le constructeur de recopie de ta classe Vecteur ce qui te facilitera la tache pour le constructeur de recopie de la class objet.
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
3 août 2007 à 11:08
3 août 2007 à 11:08
Qu'est ce que tu appelles un constructeur de recopie?
Peux-tu me donner un exemple?Merci
Peux-tu me donner un exemple?Merci
Zempachi
Messages postés
7472
Date d'inscription
vendredi 14 octobre 2005
Statut
Contributeur
Dernière intervention
5 juin 2020
906
>
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
3 août 2007 à 13:31
3 août 2007 à 13:31
Aie!
Dans ce cas là je te conseille de voir quelques tuto/cours:
https://c.developpez.com/cours/#cours-cpp
http://www.up.univ-mrs.fr/wcpp/V2/index.htm
http://www.up.univ-mrs.fr/wcpp/V1/lecons.htm
et pour le constructeur de recopie ici (attention c'est un pdf) page 6 "Constructeur par copie":
http://www.up.univ-mrs.fr/wcpp/V1/Lecons/L13.pdf
Dans ce cas là je te conseille de voir quelques tuto/cours:
https://c.developpez.com/cours/#cours-cpp
http://www.up.univ-mrs.fr/wcpp/V2/index.htm
http://www.up.univ-mrs.fr/wcpp/V1/lecons.htm
et pour le constructeur de recopie ici (attention c'est un pdf) page 6 "Constructeur par copie":
http://www.up.univ-mrs.fr/wcpp/V1/Lecons/L13.pdf
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
>
Zempachi
Messages postés
7472
Date d'inscription
vendredi 14 octobre 2005
Statut
Contributeur
Dernière intervention
5 juin 2020
3 août 2007 à 14:18
3 août 2007 à 14:18
En fait j'ai regardé des vieux cours j'ai ça.Donc je vais regarder ça à tête reposée et essayer de l'implanter.
Merci pour ton aide.
Bon je viens de rajouter les constructeurs suivant:
Pour la classe vecteur:
Pour la classe objet:
Mais j'ai toujours le même message d'erreur
Merci pour ton aide.
Bon je viens de rajouter les constructeurs suivant:
Pour la classe vecteur:
Vecteur::Vecteur(const Vecteur & v) { x=v.x; y=v.y; }
Pour la classe objet:
Objet::Objet(const Objet & o) { pos=o.pos; vitdir=o.vitdir; taille=o.taille; }
Mais j'ai toujours le même message d'erreur
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
>
Zempachi
Messages postés
7472
Date d'inscription
vendredi 14 octobre 2005
Statut
Contributeur
Dernière intervention
5 juin 2020
7 août 2007 à 10:29
7 août 2007 à 10:29
Malgré le constructeur de recopie j'ai toujours le message d'erreur du début.Est-ce que j'ai mal écrit le constructeur de recopie de la classe objet ou vecteur.
Pour la classe vecteur:
Pour la classe objet:
Pour la classe vecteur:
Vecteur::Vecteur(const Vecteur & v) { x=v.x; y=v.y; }
Pour la classe objet:
Objet::Objet(const Objet & o) { pos=o.pos; vitdir=o.vitdir; taille=o.taille; }
Zempachi
Messages postés
7472
Date d'inscription
vendredi 14 octobre 2005
Statut
Contributeur
Dernière intervention
5 juin 2020
906
>
Zempachi
Messages postés
7472
Date d'inscription
vendredi 14 octobre 2005
Statut
Contributeur
Dernière intervention
5 juin 2020
7 août 2007 à 12:20
7 août 2007 à 12:20
Est-ce que j'ai mal écrit le constructeur de recopie de la classe objet ou vecteur.
Et bien tout dépend de ta classe Vecteur.
Copie la ici pour voir.
A noter que le constructeur de recopie est étroitement lié à l'opérateur "=". Il n'y a qu'à voir dans la définition de tes constructeur de recopie ou tu l'utilise.
Il faut donc aussi vérifier de ce coté là aussi.
Bref, copie colle la classe Vecteur (déclaration et surtout définition).
Aussi si la classe Vecteur a également un attribut défini par une autre classe, il faudra également la copier.... et ainsi de suite... ^^
Et bien tout dépend de ta classe Vecteur.
Copie la ici pour voir.
A noter que le constructeur de recopie est étroitement lié à l'opérateur "=". Il n'y a qu'à voir dans la définition de tes constructeur de recopie ou tu l'utilise.
Il faut donc aussi vérifier de ce coté là aussi.
Bref, copie colle la classe Vecteur (déclaration et surtout définition).
Aussi si la classe Vecteur a également un attribut défini par une autre classe, il faudra également la copier.... et ainsi de suite... ^^
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
7 août 2007 à 13:07
7 août 2007 à 13:07
Voila ma classe vecteur
vecteur.h
vecteur.cpp
Ma classe objet
objet.cpp
objet.h
vecteur.h
#ifndef H_VECTEUR #define H_VECTEUR #include <cmath> class Vecteur { private: double x, y; public: //constructeur Vecteur(); //constructeur par recopie Vecteur(const Vecteur &); //destructeur ~Vecteur(); void set(double, double); void setX(double x); void setY(double y); void normalise(); void setNormalise(double, double); double getX(); double getY(); }; #endif
vecteur.cpp
#include "vecteur.h" Vecteur::Vecteur() { x = 0; y = 0; } Vecteur::Vecteur(const Vecteur &v) { x=v.x; y=v.y; } Vecteur::~Vecteur() { } void Vecteur::set(double x1, double y1) { x = x1; y = y1; } void Vecteur::setX(double x1) { x = x1; } void Vecteur::setY(double y1) { y = y1; } double Vecteur::getX() { return x; } double Vecteur::getY() { return y; } void Vecteur::normalise() { double n = x*x + y*y; n = sqrt(n); x /= n; y /= n; } void Vecteur::setNormalise(double x1, double x2) { x = x1; x = x2; normalise(); }
Ma classe objet
objet.cpp
#include "define.h" #include "objet.h" Objet::Objet() { pos.set(0,0); vitdir.set(0,0); taille.set(0,0); } Objet::Objet(const Objet &o) { pos=o.pos; vitdir=o.vitdir; taille=o.taille; } Objet::~Objet() { } void Objet::SetPos(double x, double y) { pos.setX(x); pos.setY(y); } void Objet::SetDir(double x,double y) { vitdir.setX(x); vitdir.setY(y); } void Objet::SetTaille(double x, double y) { taille.setX(x); taille.setY(y); } void Objet::SetVit(double x,double y) { } double Objet::GetX() { return pos.getX(); } double Objet::GetY() { return pos.getY(); } double Objet::GetVX() { return vitdir.getX(); } double Objet::GetVY() { return vitdir.getY(); } double Objet::GetW() { return taille.getX(); } double Objet::GetH() { return taille.getY(); } void Objet::UpdatePosObjet() { //Test collision if((GetX()<=0)||(GetX()+GetW()>=LARGEUR)) { SetDir(-GetVX(),GetVY()); } if((GetY()<=0)||(GetY()+GetH()>=HAUTEUR)) { SetDir(GetVX(),-GetVY()); } pos.setX(pos.getX()+vitdir.getX()); pos.setY(pos.getY()+vitdir.getY()); } void Objet::Affiche() { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode( GL_MODELVIEW ); glLoadIdentity( ); //dessin carré glBegin(GL_QUADS); glColor3ub(255,0,0); glVertex2d(GetX(),GetY()); glColor3ub(255,0,0); glVertex2d(GetX()+GetW(),GetY()); glColor3ub(0,0,255); glVertex2d(GetX()+GetW(),GetY()+GetH()); glColor3ub(0,0,255); glVertex2d(GetX(),GetY()+GetH()); glEnd(); glFlush(); SDL_GL_SwapBuffers(); }
objet.h
#ifndef H_OBJET #define H_OBJET #include "vecteur.h" #include <windows.h> #include <SDL/SDL.h> #include <GL/gl.h> #include <GL/glu.h> class Objet { private: Vecteur pos, vitdir,taille; public: //constructeur Objet(); //constructeur par recopie Objet(const Objet & o); //destructeur ~Objet(); //Prendre position objet void SetPos(double,double); //Prendre direction objet void SetDir(double,double); //Prendre taille void SetTaille(double,double); //Prendre vitesse void SetVit(double,double); //donner position double GetX(); double GetY(); //donner direction double GetVX(); double GetVY(); //donner taille double GetW();//W pour largeur double GetH();//H pour hauteur //mise à jour position objet void UpdatePosObjet(); //Affichage objet void Affiche(); }; #endif
Zempachi
Messages postés
7472
Date d'inscription
vendredi 14 octobre 2005
Statut
Contributeur
Dernière intervention
5 juin 2020
906
7 août 2007 à 13:35
7 août 2007 à 13:35
Pour pouvoir utiliser l'opérateur "=" dans le Constructeur de recopie suivant:
il faut surcharger l'opérateur "=" dans la classe Vecteur
Objet::Objet(const Objet &o) { pos=o.pos; vitdir=o.vitdir; taille=o.taille; }
il faut surcharger l'opérateur "=" dans la classe Vecteur
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
7 août 2007 à 14:23
7 août 2007 à 14:23
Je viens de surcharger l'opérateur = avec le code suivant
Mais j'ai toujours le même message d'erreur lors de la compilation
Vecteur Vecteur::operator=(const Vecteur &v) { Vecteur v2; v2.x=v.x; v2.y=v.y; return v2; }
Mais j'ai toujours le même message d'erreur lors de la compilation
Zempachi
Messages postés
7472
Date d'inscription
vendredi 14 octobre 2005
Statut
Contributeur
Dernière intervention
5 juin 2020
906
7 août 2007 à 14:58
7 août 2007 à 14:58
Ce serait plutot:
Vecteur Vecteur::operator=(const Vecteur &v)
{
this->x=v.x;
this->.y=v.y;
return *this;
}
Vecteur Vecteur::operator=(const Vecteur &v)
{
this->x=v.x;
this->.y=v.y;
return *this;
}
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
7 août 2007 à 15:34
7 août 2007 à 15:34
ça revient un peu au même sauf que ta définition est plus élégante.Mais j'ai toujours le même message d'erreur.
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
7 août 2007 à 20:24
7 août 2007 à 20:24
#include <iostream> class my_vector{ public: typedef char x_t; typedef int y_t; protected: x_t x; y_t y; public: my_vector(char x0,int y0):x(x0),y(y0){} inline const x_t & get_x() const{return x;} inline const y_t & get_y() const{return y;} inline my_vector & operator=(const my_vector & src){ x = src.get_x(); y = src.get_y(); return *this; } }; inline std::ostream & operator<<(std::ostream & out,const my_vector & v){ out << "[x=" << v.get_x() << ",y=" << v.get_y() << ']'; return out; } int main(){ my_vector v1('a',37),v2('b',55); std::cout << "v1 = " << v1 << "\tv2 = " << v2 << std::endl; v2 = v1; std::cout << "v1 = " << v1 << "\tv2 = " << v2 << std::endl; return 0; }
ce qui donne :
(mando@aldur) (~) $ g++ -W -Wall plop.cpp (mando@aldur) (~) $ ./a.out v1 = [x=a,y=37] v2 = [x=b,y=55] v1 = [x=a,y=37] v2 = [x=a,y=37]
Bonne chance
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
8 août 2007 à 13:17
8 août 2007 à 13:17
mamiemando je compile pas avec g++ mais isual c++ donc arrête de m'envoyer des commandes sous linux(d'ailleurs je suis sous xp) puis surtout ça résout pas mon problème
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
8 août 2007 à 19:53
8 août 2007 à 19:53
Mais ça change rien que ce g++ ou visual !!! C'est le MEME code source. C'est juste pour te montrer ce que ça donne quand on exécute. La seule chose que tu as à faire c'est d'adapter le code que je te donne à ton cas particulier.
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
8 août 2007 à 21:00
8 août 2007 à 21:00
Justement j'ai adapté mais ça n'a rien changé.
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
9 août 2007 à 00:30
9 août 2007 à 00:30
Copie colle l'endroit qui ne compile pas (et les lignes alentours) et le message d'erreur. Si ça plante dans une classe, copie colle la classe entière. Il y a quelque chose de bizarre dans cette histoire....
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
9 août 2007 à 16:35
9 août 2007 à 16:35
Voila le message d'erreur
Ce message apparaît surtout quand j'utilise une méthode de la classe vector.
Par exemple celle qui plante c'est:
pour
jeu.obj : error LNK2019: symbole externe non résolu __imp___CrtDbgReportW référencé dans la fonction "public: __thiscall std::_Vector_const_iterator<class Objet,class std::allocator<class Objet> >::_Vector_const_iterator<class Objet,class std::allocator<class Objet> >(class Objet *,class std::_Container_base const *)" (??0?$_Vector_const_iterator@VObjet@@V?$allocator@VObjet@@@std@@@std@@QAE@PAVObjet@@PBV_Container_base@1@@Z) D:\Programmation\Prog SDL\Testopengl\Debug\Testopengl.exe : fatal error LNK1120: 1 externes non résolus
Ce message apparaît surtout quand j'utilise une méthode de la classe vector.
Par exemple celle qui plante c'est:
objets.clear();
pour
std::vector<Objet > objets;
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
9 août 2007 à 21:13
9 août 2007 à 21:13
Désolé je comprends rien au messages d'erreur de visual. J'ai l'impression que la méthode clear appelle une fonction de Objet qui est déclarée mais pas implémentée. Est ce que toutes les méthodes de Objet sont bien implémentées, en particulier le destructeur ?
Est ce que tu arrives à compiler cet exemple :
Bonne chance
Est ce que tu arrives à compiler cet exemple :
#include <vector> class plop_t{ protected: int x; char a; public: plop_t(){} ~plop_t(){} plop_t(int x0,char a0):x(x0),a(a0){} }; int main(){ std::vector<plop_t> x; x.push_back(plop_t(1,'a')); x.push_back(plop_t(2,'b')); x.push_back(plop_t(4,'f')); x.push_back(plop_t(3,'d')); x.clear(); return 0; }
Bonne chance
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
10 août 2007 à 09:40
10 août 2007 à 09:40
Ben on est 2 à ne pas comprendre les messages d'erreurs de visual.
Sinon j'arrive à exécuter ton programme.
Sinon j'arrive à exécuter ton programme.
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
10 août 2007 à 10:07
10 août 2007 à 10:07
Bon, le problème vient manifestement de ta classe Objet. Vérifie que chaque membre est implémenté. Dans un premier temps, pour tester, backupe les fichiers Objet.hpp et .cpp. Ensuite, transfère le code des méthodes de Objet dans le .hpp, supprime le fichier Objet.cpp. Toutes les méthodes seront donc implémentées dans le .hpp.
Afin d'éviter les problèmes de définitions multiples, en particulier si Objet.hpp est inclu par plusieurs fichiers .cpp, rajoute au début de chaque méthode de Objet le mot clé "inline". excepté pour le destructeur et le(s) constructeur(s). Exemple :
Si ça marche, transfère progressivement chaque méthode de Objet.hpp dans le Objet.cpp (en supprimant le inline associé). On va bien finir par trouver qu'est ce qui bloque dans cet objet...
En tout cas ton erreur ressemble à l'appel d'une fonction déclarée mais pas implémentée. Donc vérifie que tout le monde est bien implémenté.
Le truc c'est que les messages d'erreur Visual sont complètement illisibles (pas de numéro de ligne, pas le nom de la méthode qui bloque...). Au pire installe temporairement un autre environnement de développement genre devcpp, là au moins les messages seront compréhensibles.
http://www.bloodshed.net/
Bonne chance
Afin d'éviter les problèmes de définitions multiples, en particulier si Objet.hpp est inclu par plusieurs fichiers .cpp, rajoute au début de chaque méthode de Objet le mot clé "inline". excepté pour le destructeur et le(s) constructeur(s). Exemple :
class plop_t{ protected: int x; char a; public: plop_t(){} ~plop_t(){} plop_t(int x0,char a0):x(x0),a(a0){} inline int get_x() const{return x;} inline char get_a() const{return a;} };
Si ça marche, transfère progressivement chaque méthode de Objet.hpp dans le Objet.cpp (en supprimant le inline associé). On va bien finir par trouver qu'est ce qui bloque dans cet objet...
En tout cas ton erreur ressemble à l'appel d'une fonction déclarée mais pas implémentée. Donc vérifie que tout le monde est bien implémenté.
Le truc c'est que les messages d'erreur Visual sont complètement illisibles (pas de numéro de ligne, pas le nom de la méthode qui bloque...). Au pire installe temporairement un autre environnement de développement genre devcpp, là au moins les messages seront compréhensibles.
http://www.bloodshed.net/
Bonne chance
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
12 août 2007 à 15:20
12 août 2007 à 15:20
Bon j'essaye dev c++.
il faut juste je trouve les ajouts dans les liens à faire pour compiler avec une librairie opengl.Pour la SDL j'ai trouvé et ça marche.
il faut juste je trouve les ajouts dans les liens à faire pour compiler avec une librairie opengl.Pour la SDL j'ai trouvé et ça marche.
nonoleharicot
Messages postés
114
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
11 novembre 2007
10
12 août 2007 à 15:38
12 août 2007 à 15:38
Bon j'ai trouvé les liens qui me manquaient pour l'opengl.
J'ai compilé mon programme et tout marche.Alors que sous visual non.
Des fois il y a des grands mystères.
J'ai compilé mon programme et tout marche.Alors que sous visual non.
Des fois il y a des grands mystères.
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
13 août 2007 à 00:30
13 août 2007 à 00:30
Comme tu dis :) Je pense que c'est juste les options de visual qui sont mal renseignées mais malheureusement ça fait bien longtemps que je n'ai pas touché à ce logiciel.
2 août 2007 à 18:27
J'utilise le vector dans une classe jeu que j'ai découpé en jeu.h et jeu.cpp
Voila le jeu .h
Voila le jeu.cpp