Programme point

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

3 réponses

  1. Modérateur
    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 !
    1. Modérateur
      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;
      }
    2. 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
    3. Modérateur
      Ce n'est pas #include "sstream", mais #include <iostream>, de plus il te faut soit std:: avant cout, soit using namespace std;
    4. 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 ???
  2. Modérateur
    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
    1. merci beaucoup
    2. 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 ????
    3. Modérateur
      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);
      }
    4. 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
    5. Modérateur
      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"
  3. 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.
    1. Modérateur
      Je suppose que tu parles de abs...

      Pour éviter ce genre d'ambiguïté il faudrait surement utiliser un namespace, non ?
    2. ché pas je suis débutant en c++
    3. Modérateur
      À 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)
    4. svp aide moi pour implémente l 'opérateur algébrique intersection en c++
    5. @ 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.