Partage
  • Partager sur Facebook
  • Partager sur Twitter

Surcharger une fonction depuis une autre classe

Sujet résolu
    25 mai 2008 à 20:12:51

    Bonjour

    est t-il possible de surcharger une fonction depuis un autre classe sans toucher au code de la classe auquel appartient la fonction à surcharger?
    Je veux transformer
    int isalpha ( int c ); (de la classe ctype.h)
    en
    bool isalpha (string c);

    Merci.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      25 mai 2008 à 20:16:46

      ctype.h n'est pas une classe mais un en-tête que l'on inclut pour obtenir le prototype de la fonction isalpha. Ensuite, il est tout à fait possible de surcharger cette fonction, il faut juste veiller à ne pas la mettre dans le namespace standard
      • Partager sur Facebook
      • Partager sur Twitter
        25 mai 2008 à 20:18:31

        Heu oui pardon, c'est l'en tête. :p chui bête.

        si je marque bool isalpha(std::string chaine) tout simplement dans une autre classe ca marche?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          25 mai 2008 à 20:20:04

          Oui. Passe ta chaine par référence constante. Par contre, fait attention au sens de ta fonction.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            25 mai 2008 à 20:21:38

            Y a pas de classe ici. std est un espace de nommage (namespace).

            Tu t'embrouilles un peu. Relis bien http://www.siteduzero.com/tuto-3-13047 [...] tml#ss_part_2 .
            • Partager sur Facebook
            • Partager sur Twitter
              25 mai 2008 à 20:22:45

              Comme ca:

              bool isalpha(const std::string &chaine)
              


              Pourtant dans quand je met mon prototype dans mon .h il ne reconnait pas la classe string à moins de mettre std avec l'opérateur de portée
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                25 mai 2008 à 21:03:25

                C'est normal.
                La classe string n'existe que dans le namespace standard nomé std., d'où l'utilisation de std:: pour accéder à la classe.
                • Partager sur Facebook
                • Partager sur Twitter
                  25 mai 2008 à 21:26:22

                  Voilà la dilemme:

                  BDD_client.h

                  #pragma once
                  #include "alpha.h"

                  class BDD_client
                  {
                  public:
                  	BDD_client(void);
                  	virtual ~BDD_client(void);
                  	void load_client();
                  	client* new_client(int id,std::string nom,std::string prenom,std::string numero,std::string rue,std::string CP,std::string ville);
                  	void add_client(client *client_temp,char &key);
                  	bool is_empty_client();
                  	void display_list_client();
                  	void prompt_new_client();
                  
                  private:
                  	alpha *tab;
                  };
                  


                  BDD_client.cpp

                  #include "StdAfx.h"
                  #include "BDD_client.h"
                  #include "client.h"
                  #include "affichage.h"
                  
                  
                  using namespace std;
                  
                  //Commande de saisie permettant d'ajouter des clients
                  void BDD_client::prompt_new_client()
                  {
                  	char touche;
                  
                  	textbackground(BLUE);
                  	textcolor(YELLOW);
                  	gotoxy(0,2);
                  	do
                  	{
                  		string nom,prenom,numero,rue,CP,ville;
                  		int id;
                  		int ok;		
                  
                  		cout << endl << endl << "Id: ";
                  		cin >> id;
                  		
                  		do
                  		{
                  			
                  			cout << "Nom: ";
                  			cin >> nom;
                  			if(islower(nom[0]))
                  				nom[0]=toupper(nom[0]);
                  			ok=client::isalpha(nom);
                  		}while(ok==0);
                  
                  		cout << "Prenom: ";
                  		cin >> prenom;
                  
                  		cout << "numero :";
                  		cin >> numero;
                  
                  		cout << "rue: ";
                  		cin >> rue;
                  
                  		cout << "CP: ";
                  		cin >> CP;
                  
                  		cout << "ville: ";
                  		cin >> ville;
                  		
                  		//ajout des clients dans la liste chainée
                  		add_client(new_client(id,nom,prenom,numero,rue,CP,ville),nom[0]);
                  		
                  		//proposition de continuer à rajouter des clients
                  		cout << endl << "pour rajouter une personne appuyer entree sinon echap";
                  
                  		//saisie sécurisée
                  		do
                  		{
                  			touche=_getch();
                  		}while(touche!=13 && touche!=27);
                  	}while(touche==13);
                  }
                  


                  client.h

                  #pragma once
                  #include "Adresse.h"
                  #include "commande.h"
                  #include "produit.h"
                  
                  class client
                  {
                  	friend class BDD_client;
                  
                  public:
                  	client(void);
                  	virtual ~client(void);
                  	void acheter();
                  	void avis();
                  	static int isalpha(const std::string &chaine);
                  
                  private:
                  	Adresse adresse;
                  	int id;
                  	std::string nom;
                  	std::string prenom;
                  	commande *commande;
                  	produit *produit;	
                  	client *suivant;
                  };
                  



                  # pragma once
                  #include "StdAfx.h"
                  #include "client.h"
                  
                  using namespace std;
                  
                  client::client(void)
                  {
                  	suivant=NULL;
                  	commande=NULL;
                  	produit=NULL;
                  }
                  
                  client::~client(void)
                  {
                  }
                  
                  void client::acheter()
                  {
                  }
                  
                  void client::avis()	
                  {
                  }
                  
                  <gras>//Ici ca pose problème</gras>
                  int isalpha(const string &chaine)
                  {
                  	int ok;
                  	for(size_t i=0;i<chaine.size();i++)
                  	{
                  		ok=isalpha(chaine[i]);
                  		if(ok==0)
                  			return 0;
                  	}
                  	return 1;
                  }
                  



                  Erreur donné par Visual C++:

                  Erreur 1 error LNK2019: symbole externe non résolu "public: static int __cdecl client::isalpha(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?isalpha@client@@SAHABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) référencé dans la fonction "public: void __thiscall BDD_client::prompt_new_client(void)" (?prompt_new_client@BDD_client@@QAEXXZ) BDD_client.obj

                  Erreur 2 fatal error LNK1120: 1 externes non résolus D:\Sabir\EFREI\bootik\Debug\bootik.exe 1



                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    25 mai 2008 à 21:42:18

                    isalpha est membre de ta classe client,il faut donc utiliser client:: pour la définir.
                    => Va revoir le cours.
                    int client::isalpha(const string &chaine)
                    {
                            int ok;
                            for(size_t i=0;i<chaine.size();i++)
                            {
                                    ok=isalpha(chaine[i]);
                                    if(ok==0)
                                            return 0;
                            }
                            return 1;
                    }
                    


                    Ensuite pour appeller comme tu le fait la méthode, il faut qu'elle soit static.
                    => Va revoir le cours bis.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 mai 2008 à 21:47:38

                      Chui bête, mais quel c** en effet j'ai oublié l'opérateur de portée. Merci. :p
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Surcharger une fonction depuis une autre classe

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown