Programme point

zmandar -  
loupius Messages postés 789 Statut Membre -
Bonjour,

j 'ai créé cette classe point dans un fichier point.h
class point
{private:
	int abs ;
	int ord;
public:
	void initialise(int ,int);
	void  deplace(int ,int);
	void affiche();
	void point::initialise(int x,int y)
	{ abs=x;
	ord=y;
	}
	void point::deplace(int x,int y)
	{abs =abs+x;
	ord=ord+y;
	}
	void point::affiche(){
		cout<<  "("<<x<<"," << y <<")" ;
	}

et j 'ai fait le main

// exercice2.cpp : définit le point d'entrée pour l'application console.
//

#include " point.h"
#include "stdafx.h"


 int main ()
{
	point p1 ;
	p1.initialise(1,3);
	p1.deplace(4,3);
	p1.affiche();

}


lorsque je fait l 'exécution il me dit error C2065: 'point' : identificateur non déclaré
svp iade moi à corriger cette erreurs
A voir également:

3 réponses

KX Messages postés 19031 Statut Modérateur 3 020
 
Tu ne dois pas mettre point:: si tu implémentes tes méthodes dans le header, c'est nécessaire par contre lorsque tu fais l'implémentation dans un .cpp

Remarque : ta méthode initialise a l'air de faire ce qu'on attend d'un constructeur, donc implémentes plutôt le constructeur !
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Au choix : on met toute l'implémentation dans le header (déconseillé)

// point.h

#include <iostream>

class point
{
private:
	int abs;
	int ord;
public:
	void initialise(int x,int y)
	{
		abs=x;
		ord=y;
	}

	void deplace(int x,int y)
	{
		abs =abs+x;
		ord=ord+y;
	}

	void affiche()
	{
		std::cout << "(" << x << "," << y << ")";
	}
};

Ou on sépare déclaration et implémentation (conseillé)

// point.h

class point
{
private:
	int abs;
	int ord;

public:
	void initialise(int,int);
	void deplace(int,int);
	void affiche();
};

// point.cpp

#include <iostream>
#include "point.h"

void point::initialise(int x,int y)
{
	abs=x;
	ord=y;
}

void point::deplace(int x,int y)
{
	abs=abs+x;
	ord=ord+y;
}

void point::affiche()
{
	std::cout << "(" << x << "," << y << ")";
}

Dans les deux cas, le main est correct.
Maintenant, je modifie ce code pour mettre en place le constructeur (encore mieux)

// point.h

class point
{
private:
	int abs;
	int ord;

public:
	point(int,int);
	void deplace(int,int);
	void affiche();
};

// point.cpp

#include <iostream>
#include "point.h"

point::point(int x,int y)
{
	abs=x;
	ord=y;
}

void point::deplace(int x,int y)
{
	abs=abs+x;
	ord=ord+y;
}

void point::affiche()
{
	std::cout << "(" << x << "," << y << ")";
}

Dans ce cas le main devient :

#include "point.h"

int main()
{
	point p1(1,3);
	p1.deplace(4,3);
	p1.affiche();

	return 0;
}
0
zmandar
 
le fichier point.h
#include <iostream>
using namespace std ;

class point
{private:
int abs ;
int ord;
public:
void initialise(int ,int);
void deplace(int ,int);
void affiche();};


le fichier point.cpp


#include "point.h"
#include "sstream"
void point::initialise(int x,int y)
{ abs=x;
ord=y;
}
void point::deplace(int x,int y)
{abs =abs+x;
ord=ord+y;
}
void point::affiche(){
cout<< "("<<x<<"," << y <<")" ;
}

et le main
// exercice2.cpp : définit le point d'entrée pour l'application console.
//
#include "point.h"

#include "stdafx.h"


int main ()
{
point p1 ;
p1.initialise(1,3);
p1.deplace(4,3);
p1.affiche();

}

je fait comme ca mais aussi ne pas exécutable svp aide moi
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Ce n'est pas #include "sstream", mais #include <iostream>, de plus il te faut soit std:: avant cout, soit using namespace std;
0
zmandar
 
j' ai fait comme vous ma dit mais lorsque je fait l 'execution il me dit error C2065: 'point' : identificateur non déclaré
pour faire un fichier point.h je fait fichier->nouveau fichier ???
0
KX Messages postés 19031 Statut Modérateur 3 020
 
J'ai vu dans ton code #include "stdfax.h", sauf erreur c'est un en-tête pré-compilé Visual Studio, c'est possible que ça te pose problème.

Quand tu créé un nouveau projet, tu devrais cocher la case "projet vide" plutôt que "en-tête précompilé"

Ensuite tu fais ajouter une classe C++
Nom de la classe point, le reste par défaut.

Tu colles mon code à la place de celui généré.
Puis nouvel élément fichier c++, nom : exercice2, et tu colles mon code.

Puis tu compiles, et là il y a une erreur facile à résoudre, dans point::affiche, ce n'est pas x et y, mais abs et ord qu'il faut afficher. Mais sinon, ça marche, et ça t'affiche (5,6)
La confiance n'exclut pas le contrôle
0
zmandar
 
merci beaucoup
0
zmandar
 
svp je veux distance qui calcule la distance entre 2 point
float point::distance(point p ){
int dx=abs-abs.p;
int dy=ord-ord.p;
return sqrt(dx*dx+dy*dy);}
et dans le main je ajouter float h=p1.distance(p2);
std::cout<<h;mais lorsque je fait l'execution il n 'affiche pas la valeur de h pourquoi ????
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Mais Visual Studio te le dit pourquoi :

error C2668: 'sqrt' : appel ambigu à une fonction surchargée
-> il ne faut pas utiliser int dx, dy, mais float dx, dy puisque ton return est de type float

error C2228: la partie gauche de '.p' doit avoir un class/struct/union
-> abs n'est pas un objet, tu ne peux pas faire abs.p, il faut faire p.abs

error C2228: la partie gauche de '.p' doit avoir un class/struct/union
-> ord n'est pas un objet, tu ne peux pas faire ord.p, il faut faire p.ord

En corrigeant, il vient deux avertissements :

warning C4244: 'initialisation' : conversion de 'int' en 'float', perte possible de données
-> remplace float dx par double dx

warning C4244: 'initialisation' : conversion de 'int' en 'float', perte possible de données
-> remplace float dy par double dy

Puis tu recompiles, et il reste un dernier avertissement :

warning C4244: 'return' : conversion de 'double' en 'float', perte possible de données
-> remplace float point::distance, par double::distance

Au final tu devras donc avoir :

double point::distance(point p )
{ 
	double dx=abs-p.abs; 
	double dy=ord-p.ord; 
	return sqrt(dx*dx+dy*dy);
}
0
zmandar
 
error C2556: 'double point::distance(point)' : la fonction surchargée ne diffère que par le type de retour de 'float point::distance(point)'
voir la déclaration de 'point::distance'
error C2371: 'point::distance' : redéfinition ; types de base différents
voir la déclaration de 'point::distance'
error C3861: 'sqrt' : identificateur introuvable

il m 'affiche ses erreurs
0
KX Messages postés 19031 Statut Modérateur 3 020
 
error C2556: 'double point::distance(point)' : la fonction surchargée ne diffère que par le type de retour de 'float point::distance(point)' 
voir la déclaration de 'point::distance' 

error C2371: 'point::distance' : redéfinition ; types de base différents 
voir la déclaration de 'point::distance' 

-> pour distance, tu n'as pas modifié float en double dans point.h

error C3861: 'sqrt' : identificateur introuvable
-> #include "math.h"
0
loupius Messages postés 789 Statut Membre 148
 
Bien que cela ne soit pas interdit, il n'est pas très judicieux de donner à une variable le nom d'une fonction.
Bonne soirée.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Je suppose que tu parles de abs...

Pour éviter ce genre d'ambiguïté il faudrait surement utiliser un namespace, non ?
0
zmandar
 
ché pas je suis débutant en c++
0
KX Messages postés 19031 Statut Modérateur 3 020
 
À vrai dire c'était une question ouverte, puisque loupius en parlait...
Mais c'est évident que tu débutes, et il y a des choses qui peuvent encore être faites pour améliorer ton code (mettre des const, des &, et/ou des inline, par exemple)
0
zmandar
 
svp aide moi pour implémente l 'opérateur algébrique intersection en c++
0
loupius Messages postés 789 Statut Membre 148
 
@ KX
Pour le compilateur, il n'y a pas d'ambiguïté... mais c'est surtout pour le (re)lecteur du programme.
Bonne soirée.
0