IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Appeler une instance à partir d'un de ses attributs


Sujet :

C++

  1. #1
    j3d
    j3d est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Par défaut Appeler une instance à partir d'un de ses attributs
    Bonjour !

    Je débute en C++ et je suis un peu parasité par mon expérience en VB.
    Je cherche à appeler une instance de classe à partir d'un de ses attributs, en l'occurrence une string, un peu à la manière d'une collection en VB ou l'on peut faire collection.listitem("nom").
    Par exemple j'ai une classe "Personne" avec un attribut de type string que j'appele "nom". Je génère plusieurs instances de "Personne" que j'appele "maPersonne" dans un tableau, et leur donne différentes valeurs pour l'attribut nom.
    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Personne maPersonne[3];
    maPersonne[0].nom="jacques";
    maPersonne[1].nom="bernard";
    maPersonne[2].nom="jean";
    Après comment je peux faire pour affecter tous les attributs de l'une de ces instance à une nouvelle instance de "Personne" par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Personne X;
    X=maPersonne("bernard");

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut, bienvenue sur le forum. Pour répondre à ta question, soit tu surcharge l'opérateur =, soit tu fais un constructeur par copie.
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    class Personne
    {
    public :
       Personne() : nom_("") {}
      Personne(const std::string & nom) : nom_(nom) {}
      Personne(const Personne & p) : nom_(p.nom_) {} // constructeur par copie
      ~Personne() {}
     
      const std::string & getNom() const { return nom_; }
      void setNom(const std::string & nom) { nom_ = nom; }
     
      Personne & operator = (const Personne & p)
      {
        // traitement de l'auto affectation
        if(this == &p)
         return *this;
     
       nom_ = p.nom_;
     
       return *this;
      }
     
    private :
      std::string nom_;
    }; 
     
    int main()
    {
    Personne maPersonne[3];
    maPersonne[0].setNom("jacques");
    maPersonne[1].setNom("bernard");
    maPersonne[2].setNom("jean");
     
    Personne X(maPersonne[0]);
    Personne Y = maPersonne[1];
     
      cout << "mon nom est " << X.getNom() << endl;
     
    return 0;
    }

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par j3d Voir le message
    Je débute en C++ et je suis un peu parasité par mon expérience en VB.
    Je cherche à appeler une instance de classe à partir d'un de ses attributs, en l'occurrence une string, un peu à la manière d'une collection en VB ou l'on peut faire collection.listitem("nom").
    Salut et bienvenu,
    En C++, le langage ne propose pas nativement une telle fonctionnalité. La solution consiste plutôt à faire une recherche dans ta liste avec le critère que tu souhaites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef std::list<Personne> liste_personne;
    liste_personne maPersonne;
    maPersonne.push_back(Personne("jacques");
    maPersonne.push_back(Personne("bernard");
    maPersonne.push_back(Personne("jean");
     
    liste_personne::const_iterator it = 
        std::find(maPersonne.begin(),maPersonne.end(),memeNom("bernard"));
    if(it!=maPersonne.end())
    {
        std::cout<<it->Nom<<" "<<it->Prenom<<"\n";
    }
    memeNom est un foncteur, c'est à dire une classe qui spécialise l'opérateur() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct memeNom
    {
    memeNom(std::string nom_):nom_cherche(nom_){}
     
    bool operator()(Personne const& personne_)
    {
       return personne_.Nom==nom_cherche;
    }
    private:
    std::string nom_cherche;
    };

  4. #4
    j3d
    j3d est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 11
    Par défaut
    Wahouuu ! Un peu dur à intégrer pour un débutant comme moi mais je pense que j'ai compris, je vais essayer ce soir. Merci les gars !

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    1/Au fait, la surchargre de l'opérateur = n'a rien à voir avec ton problème.
    2/Je ne peux que te conseiller de potasser un livre ou un tuto pour démarrer en C++ : Comment débuter en C++ ? par Alp Mestan

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    1/Au fait, la surchargre de l'opérateur = n'a rien à voir avec ton problème.
    2/Je ne peux que te conseiller de potasser un livre ou un tuto pour démarrer en C++ : Comment débuter en C++ ? par Alp Mestan
    OK, j'ai peut-être mal compris sa question. Mais dans son code, quand il écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Personne X;
    X=maPersonne("bernard");
    j'en déduis qu'il a une Personne et qu'il veut la recopier dans X, d'où ma proposition de constructeur par copie ou d'opérateur =

    Mais bon, j'ai dû mal comprendre sa question... Désolé

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Citation Envoyé par salseropom Voir le message
    j'en déduis qu'il a une Personne et qu'il veut la recopier dans X, d'où ma proposition de constructeur par copie ou d'opérateur =
    Attention, ce n'est pas forcément un bon réflexe. L'opérateur = par défaut doit normalement suffire ... à moins d'être une classe particulière (type enveloppe RAII ou sans politique de copie etc.). Mais dans ce dernier cas le constructeur de copie et probablement le destructeur sont déjà redéfinis. Cf F.A.Q et suivantes pour les sémantiques de valeurs, pour les sémantiques d'entité c'est probablement ça et pour les ressources, c'est probablement une enveloppe RAII. Tout ça pour dire qu'on ne badine pas avec l'opérateur d'affectation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appeler une instance à partir d'une autre classe
    Par Anduriel dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 17/12/2011, 11h53
  2. Appeler une DLL à partir de MATLAB
    Par swap_nibble dans le forum MATLAB
    Réponses: 0
    Dernier message: 06/02/2008, 12h06
  3. Réponses: 7
    Dernier message: 01/02/2008, 16h12
  4. Appel à une fonction à partir d'une chaine de caractères
    Par becks dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/09/2007, 12h14
  5. Appeler une GUI à partir d'une GUI ?
    Par blanchonvincent dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2007, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo