Programme point
zmandar
-
loupius Messages postés 789 Statut Membre -
loupius Messages postés 789 Statut Membre -
Bonjour,
j 'ai créé cette classe point dans un fichier point.h
et j 'ai fait le main
lorsque je fait l 'exécution il me dit error C2065: 'point' : identificateur non déclaré
svp iade moi à corriger cette erreurs
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
3 réponses
-
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 !-
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; } -
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 -
-
-
-
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-
-
-
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); } -
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 -
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"
-
-
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.