Partage
  • Partager sur Facebook
  • Partager sur Twitter

Template founction

    11 mai 2019 à 17:46:31

    Bonjour

    J'essaie de récupérer le type d'utilisateur dans mon main.

    Voilà ma fonction login

    template <class T>
        static T login(const string login = "", const string password = "")
        {
            //requete
            QSqlQuery query;
            query.exec("SELECT type_id, nom, prenom, tel, email, adresse, login, "
                          "password, salaire_h, actif "
                          "FROM employe "
                          "WHERE login = '" + QString::fromStdString(login) + "' "
                          "AND password = '" + QString::fromStdString(password) + "'");
    
    
            T theUser;
    
            while(query.next())
            {
                //recuperation des donnees
                int type        = query.value(0).toInt();
                string nom      = query.value(1).toString().toUtf8().constData();
                string prenom   = query.value(2).toString().toUtf8().constData();
                int tel         = query.value(3).toInt();
                string email    = query.value(4).toString().toUtf8().constData();
                string adresse  = query.value(5).toString().toUtf8().constData();
                string login    = query.value(6).toString().toUtf8().constData();
                string password = query.value(7).toString().toUtf8().constData();
                float salaire_h = query.value(8).toFloat();
                int actif       = query.value(9).toInt();
    
                if(type == 1)
                {
                    theUser = Manager(tel,nom,email,adresse,prenom,login,password,salaire_h, actif);
                }
                else
                {
                    theUser = Employe(tel,nom,email,adresse,prenom,login,password,salaire_h, actif);
                }
    
            }
    
            return theUser;
        }

    et dans mon main

    if(typeid(Bd::login("boudif", "boudif")) == typeid(Manager))
        {
            Manager theUser = Bd::login<Manager>("boudif", "boudif");
        }
        else
        {
            Employe theUser = Bd::login<Employe>("boudif", "boudif");
        }

    mais il y a un problème au niveau du if et je n'ai trouvé de solution.

    Merci de votre aide. 

    • Partager sur Facebook
    • Partager sur Twitter
      12 mai 2019 à 10:05:39

      Pose toi ces questions :

      1/ En appelant bd::login("boudif", "boudif"), saurais tu toi déterminer quelle fonction de ton template doit être créé? Crois tu que le compilateur le saurait?

      2/ Est ce une bonne pratique de faire faire plusieurs choses à une fonction (requête dans une base de donnée + création d'un objet d'un type différent en fonction du résultat)?

      3/ Que se passe t'il lorsqu'on appelle le constructeur de copie ou l'assignation d'une classe mère en donnant une classe fille en argument?

      La question 1/ est lié à directement à ton pb je dirais, les autres questions sont liés à d'autres pb. Il y a encore d'autres soucis, globalement toute la logique de ton code est mauvaise.

      • Partager sur Facebook
      • Partager sur Twitter
        12 mai 2019 à 13:56:13

        Salut, Tu devrais utiliser une lib qui gère tout ça pour toi, ou alors faire un vrai système de gestion des types.

        Tu ne peux pas utiliser de template la, car tu dois fournir le type que tu ne connais pas encore car l'information se trouve dans ta DB. Utilises plutot l'héritage, tu as l'air d'avoir fait 2 classes avec des propriétés dupliquées.

        • Partager sur Facebook
        • Partager sur Twitter
          13 mai 2019 à 12:29:31

          Salut ,même si tu crée ta propre lib tu sera obligée de mettre dans ton objet le nom de la table 

          exemple d'une vielle lib :

          class Groupe : ObjectBdd{
          	public :
          		Groupe():ObjectBdd("Groupe"){
          			ObjectBdd::attach("id",id);
          			ObjectBdd::attachManyToMany("droit",droit);
          		}
          		
          	private:
          		unsigned int id;
          		std::vector<std::string> droit;
          
          }
          
          // l'objet doit heritée de la classe ObjectBdd
          class Utulisateur : ObjectBdd{
          	public :
          		// tu est obligé de spécifier le nom de la table ici Utulisateur
          		Utulisateur():ObjectBdd("Utulisateur")
          		{
          			// au moment de la compilation il ne save pas le nom des variables donc tu dois lui dire quelle variable est quelle champ dans la base de donnée
          			ObjectBdd::attach("id",id);
          			ObjectBdd::attach("name",name);
          			// pour faire le many to Many en auto la structure de la base de donnée doit etre parfaite
          			ObjectBdd::attachManyToMany("Groupe",listeGroupe);
          		}
          		
          		void setName(const std::string &name){this->name = name;};
          		std::string getName(){return this.name;};
          
          	private :
          		unsigned int id;
          		std::string name;
          		std::vector<Groupe> listeGroupe;
          
          }
          
          void main(){
          	GestionnaireBddObject bddObject;
          
          	//connexion au serveur 192.168.0.1 sur le port 21
          	bddObject.connect("192.168.0.1",21);
          	
          	//s'identifie
          	bddObject.identification("user",password);
          
          	//set la base de travaille 
          	bddObject.selectDataBase("base");
          
          	//permet de save les commande SQL apres les avoirs crée 
          	bddObject.setGestionnaireRequest(std::make_shared<GestionnaireRequestAuto>());
          	
          	
          	//la fonction getElement créer automatiquement la commande est la save dans 
          	std::shared_ptr<Utulisateur> utilisateur = bddObject.getElement<Utulisateur>("id",1);
          	
          	
          	utilisateur->getName(); // userTest
          	
          	utilisateur->setName("newUser");
          	
          	// la fonction crée la commande sql et save dans la base de donnée
          	utilisateur.saveElement(utilisateur);
          	
          	// la fonction récupaire la commande save dans l'object GestionnaireRequestAuto est l'execute 
          	utilisateur = bddObject.getElement<Utulisateur>("id",1);
          	
          	utilisateur->getName(); // newUser
          	
          }



          • Partager sur Facebook
          • Partager sur Twitter
            13 mai 2019 à 14:24:39

            Non, tu n'as pas besoin de mettre le nom de ta table dans ta classe.

            On peut faire beaucoup moins intrusif que ça.

            • Partager sur Facebook
            • Partager sur Twitter
              13 mai 2019 à 15:50:00

              je suis curseur de savoir comment faire ?
              • Partager sur Facebook
              • Partager sur Twitter
                13 mai 2019 à 22:17:55

                Pourquoi en dehors vue que c'est une information qui lui apparition ? (peut tu donnée un exemple )

                est vue que l'info est a l’intérieur je peut l'exportée dans d'autre format (JSON , XML , ... ) .

                • Partager sur Facebook
                • Partager sur Twitter
                  13 mai 2019 à 22:25:15

                  Qu'est ce qui t'empêches d'exporter dans d'autre formats n'importe quelle classe ? T'as juste à remplacer

                  obj.f() par f(obj) ou (edit: impossible d'écrire du code dans une balise code :/)
                  

                  Si tu veux des exemples, tu peux regarder ndb dans ma signature.

                  -
                  Edité par ads00 13 mai 2019 à 22:27:00

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Template founction

                  × 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