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

3 réponses

  1. 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
    1. 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
    2. 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
    3. 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
    4. 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
  2. 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
    1. zmandar
       
      merci beaucoup
      0
    2. 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
    3. 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
    4. 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
    5. 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
  3. 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
    1. 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
    2. zmandar
       
      ché pas je suis débutant en c++
      0
    3. 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
    4. zmandar
       
      svp aide moi pour implémente l 'opérateur algébrique intersection en c++
      0
    5. 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