[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 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 - 13 août 2007 à 00:30
Salut à tous,

Voila j'essaie d'écrire un programme en C++ en utilisant les librairies SDL et opengl.Tout marchait bien jusqu'à ce que j'utilise <vector> dans mon programme.
Voila le message d'erreur qu'il affiche quand je compile.
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

Si vous avez une solution à mon problème je vous remercie d'avance.

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
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
0
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 à 18:27
Merci pour ta réponse.
J'utilise le vector dans une classe jeu que j'ai découpé en jeu.h et jeu.cpp
Voila le jeu .h
#ifndef H_JEU
#define H_JEU
#include "define.h"
#include <vector>
#include "objet.h"
class Jeu
{
private:
	//Les objets
    std::vector<Objet> objets;

	//Initialisation des objets
	bool initObjets();
public:
	
	//constructeur
	Jeu();
	//destructeur
	~Jeu();
	//initialisation classe
	bool Jeu::init();
	//Affichage des objets
	void AfficheObjet();

};
#endif



Voila le jeu.cpp
#include "jeu.h"

Jeu::Jeu()
{
}

Jeu::~Jeu()
{
}

bool Jeu::init()
{
    return initObjets();
}

bool Jeu::initObjets()
{
	objets.clear();
    return true;
}

void Jeu::AfficheObjet()
{
}
0
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
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 :
#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
0
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
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
0
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
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
0
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
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
typedef class objet objet;
?
0
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
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
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
0

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
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.
0
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
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.
0
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
Merci.Là,c'est tout suite plus clair.
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();
}
0
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
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.
0
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
Qu'est ce que tu appelles un constructeur de recopie?
Peux-tu me donner un exemple?Merci
0
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
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
0
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
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:
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
0
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
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:

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;
}
0
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
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... ^^
0
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
Voila ma classe vecteur
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

0
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
Pour pouvoir utiliser l'opérateur "=" dans le Constructeur de recopie suivant:
Objet::Objet(const Objet &o)
{
	pos=o.pos;
	vitdir=o.vitdir;
	taille=o.taille;
}

il faut surcharger l'opérateur "=" dans la classe Vecteur

0
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
Je viens de surcharger l'opérateur = avec le code suivant

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
0
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
Ce serait plutot:

Vecteur Vecteur::operator=(const Vecteur &v)
{
this->x=v.x;
this->.y=v.y;
return *this;
}

0
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
ç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.
0
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
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
0
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
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
0
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
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.
0
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
Justement j'ai adapté mais ça n'a rien changé.
0
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
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....
0
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
Voila le message d'erreur

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;
0
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
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 :
#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
0
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
Ben on est 2 à ne pas comprendre les messages d'erreurs de visual.
Sinon j'arrive à exécuter ton programme.
0
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
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 :
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
0
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
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.
0
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
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.
0
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
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.
0