[C++] bibliothèque math ?!

Utilisateur anonyme -  
Char Snipeur Messages postés 10112 Statut Contributeur -
Bonjour,

Je compile un programme depuis quelques temps, mais les erreurs sont inexplicables à mon avis.

Voilà mes fichiers :

vecteur_3D.h :

#include<iostream>
#include<math>
#include<fstream>

class vecteur_3D
{
private:
	float x,y,z;
public:
	vecteur_3D(float a, float b, float c);
	vecteur_3D();
	float operator*(vecteur_3D &V);
	vecteur_3D operator+(vecteur_3D &V);
	void operator=(vecteur_3D &V);
	friend ostream operator<<(ostream &, vecteur_3D &);
	friend istream operator>>(istream &, vecteur_3D &);
	friend void deplacement(vecteur_3D &V, float d);
};


vecteur_3D.cpp :

#include<iostream>
#include"vecteur_3D.h"
using namespace std;

vecteur_3D::vecteur_3D(float a, float b, float c)
{
	x=a;
	y=b;
	z=c;
}

vecteur_3D::vecteur_3D(){}

float vecteur_3D::operator*(vecteur_3D &V)
{
	return x*V.x+y*V.y+z*V.z;
}

vecteur_3D vecteur_3D::operator+(vecteur_3D &V)
{
	vecteur_3D temp;
	temp.x+=x+V.x;
	temp.y+=y+V.y;
	temp.z+=z+V.z;
	return temp;
}

void vecteur_3D::operator =(vecteur_3D &V)
{
	x=V.x;
	y=V.y;
	z=V.z;
}

void vecteur_3D::deplacement(vecteur_3D &V, float d)
{
	V.x+=d;
	V.y+=d;
	V.z+=d;
}

ostream &operator<<(ostream &out, vecteur_3D &v)
{
	out<<"("<<v.x<<","<<v.y<<","<<v.z<<")"<<endl;
	return out;
}

istream &operator>>(istream &out, vecteur_3D &v)
{
	cout<<"donner x, y puis z "<<endl;
	in>>v.x>>v.y>>v.z;
	return in;
}


et enfin la main.cpp :
#include<iostream>
using namespace std;

int main()
{
	vecteur_3D V1;
	vecteur_3D V2;
	vecteur_3D VRES;
	float d;
	cin>>V1;
	cin>>V2;
	VRES=V1+V2;
	d=V1*V2;
	deplacement(VRES,d)
	cout<<VRES;
	return 0;
}


Je suis sous Microsoft Visual Studio.
Apparemment, je pense qu'il s'agit d'un problème au niveau du header math. Je ne suis pas sûre du syntaxe.

Merci d'avance :)

A voir également:

8 réponses

Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
Bonjour,

1)indique les erreurs que tu obtiens stp !

2)Dans le standard c++ la bibliotheque des fonctions mathématiques est <cmath> il me semble.

Mais par contre, je ne vois nul part où tu utilises une quelconque fonctions issue de la bibliothèque maths !
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
Pacorabanix a raison.
Soit tu inclu <cmath> soit <math.h>, et tu lie ensuite avec -lm (libm.a, la bibliothèque mathématique)
0
Utilisateur anonyme
 
Salut,

Pour la bibliothèque math, je l'ai ajoutée car je voulais calculer quelques fonctions trigonométriques à l'aide des vecteurs, mais c'était dur..

Les erreurs qu'on me fasse sortir sont :

main.cpp(6) : error C2065: 'vecteur_3D' : undeclared identifier
main.cpp(6) : error C2146: syntax error : missing ';' before identifier 'V1'
main.cpp(6) : error C2065: 'V1' : undeclared identifier
main.cpp(7) : error C2146: syntax error : missing ';' before identifier 'V2'
main.cpp(7) : error C2065: 'V2' : undeclared identifier
main.cpp(8) : error C2146: syntax error : missing ';' before identifier 'VRES'
main.cpp(8) : error C2065: 'VRES' : undeclared identifier
main.cpp(15) : error C2146: syntax error : missing ';' before identifier 'cout'
main.cpp(14) : error C3861: 'deplacement': identifier not found

Merci par l'avance.
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
Compris.
Tu ne déclare pas vecteur_3D dans main.cpp, il ne peut pas deviner à quoi ce type se rapporte si tu ne lui dit pas.
Il te suffit d'inclure vecteur_3.h dans main.cpp, et ça devrais passer.
des conseils sur ton prog :
* n'inclu pas math.h dans vecteur_3D.h mais dans vecteur_3D.cpp. En effet, tu n'en a pas besoin dans le premier fichier, mais seulement dans le deuxième. Ce n'est pas obligatoire, mais c'est plus propre.
* inclus des "chiens de garde" dans ton .h ! ça évite les inclusions multiple qui peuvent déclanchés des erreurs de compilation :
#ifndef _VECTEUR_3D
#define _VECTEUR_3D
...// ton .h tel quell
#endif

Pour l'instant ton programme est simple, mais si un jour tu as un programme plus complexe ça te sera utile, c'est une bonne habitude à prendre.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
 
Bonsoir,

J'ai supprimé au fait le header <cmath> car je m'en servirai pas pour le moment. J'ai aussi inclu le #include"vecteur_3D.h" dans mon fichier main (je me suis pas aperçue que je l'ai omis, c'est bête de ma part ). Enfin, j'ai ajouté les "chiens de garde" comme tu me l'as conseillé, et je veillerai à ce que je les mette toujours dans mes fichiers .h, merci !

Juste me reste une petite question, on m'affiche toujours des erreurs et elles se situent toutes au niveau de cette ligne :
friend ostream &operator<<(ostream &, vecteur_3D &);


Elle est mal écrite ?

Bonne soirée :)

0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
Salut.
Je ne vois pas d'où viens le problème. C'est quoi l'erreur ?
Autre remarque sur void operator=(vecteur_3D &V);.
je te conseil plutôt const vecteur_3D operator=(const vecteur_3D &V);
Le type retourné est vecteur_3D, car en C il est possible d'écrire "A=B=C;", donc pour être cohérent, retourne la valeur, ce qui te permettra de faire pareil.
pour le const devant l'argument V, c'est parceque V n'est pas sensé être modifié par cette fonction. Je crois alors que si tu lui passe un const vecteur_3D ça devrai planter, car le & rend modifiable la variable, ce qui est incompatible avec le type const.
Par exemple, en general si tu écris : A=B+C; en fait tu fais A.operator=(operator+(B,C)); , et operator+ renvoie dans le cas général un const vecteur_3D (ce qui est logique, B+C n'a pas vocation à être modifier B+C=D n'a pas vraiment de sens).
J'espère que tu comprends ce que j'ai voulu t'expliquer, je me rends compte que ce n'es pas surper clair.
0
Utilisateur anonyme
 
Resalut,

Il y a une chose que je n'arrive pas à comprendre, la méthode operator= pour la classe vecteur_3D a t-il un type de retour qui est const, void ou bien vecteur_3D ? Ca me parait que ça devrait être vecteur_3D....

J'ai modifié la ligne
void operator=(vecteur_3D &V);
pour être :
vecteur_3D operator=(const vecteur_3D &V); 

Pas question que ce programme ne tourne pas :)

Faut-il que je renvoie mon code jusqu'à cette heure-ci ?

Mille merci.

0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
ce que je te dit, ce ne sont que des conseils.
Pour moi, il vaut mieux de operator= retourne un const vecteur_3D car la valeur retournée n'a pas vocation à être modifier mais juste fourni éventuellement à l'affectation suivante.
D'un autre coté, ça empéche le passage par référence en même temps que l'affectation dans une fonction (ex : cos (a=3); qui ferai a=cos(3))
mais à ce moment là, je mettrais alors plutôt vecteur_3D& comme type de retour.
à toi de voir.
0