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 :

Créer une vue "accès seulement" d'un conteneur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut Créer une vue "accès seulement" d'un conteneur
    Bonjour

    Je souhaiterai mettre à disposition une vue d'un container qui interdise l'ajout et la suppression d'objet, mais qui permet l'accès et la modification des objets contenus dans le container. C'est du QVector (Qt) mais c'est comme des container stl.

    Pour le moment, j'ai fait un truc comme ça :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    template<class C, class T = typename C::Data>
    class const_view
    {
    public:
        const_view(const C& container) : m_cnt(&container) { }
     
        typedef typename C::const_iterator const_iterator;
     
        int size() const { return m_cnt->size(); }
     
        const_iterator begin() const { return m_cnt->begin(); }
        const_iterator end() const { return m_cnt->end(); }
     
        const T& at(int index) const { return (*m_cnt)->at(index); }
     
    private:
        const C* m_cnt;
    };
     
    template<class C, class T = typename C::Data>
    class view
    {
    public:
        view(C& container) : m_cnt(&container) { }
     
        typedef typename C::const_iterator const_iterator;
        typedef typename C::iterator iterator;
     
        int size() const { return m_cnt->size(); }
     
        const_iterator begin() const { return m_cnt->begin(); }
        const_iterator end() const { return m_cnt->end(); }
     
        iterator begin() { return m_cnt->begin(); }
        iterator end() { return m_cnt->end(); }
     
        const T& at(int index) const { return m_cnt->at(index); }
        T& at(int index) { return (*m_cnt)[index]; }
     
    private:
        C* m_cnt;
    };
     
    class DataModel : public QObject
    {
        Q_OBJECT
     
    public:
        typedef const_view<QVector<Project*>, Project*> ProjectsConstView;
        typedef view<QVector<Project*>, Project*> ProjectsView;
     
        Project* addProject();
     
        // pour retourner un vue "read-only"
        ProjectsConstView projects() const;
     
        // pour retourner une vue qui permette de modifier les objets du container
        ProjectsView projects();
     
    private:
        QVector<Project*> m_projects;
    }
    Ca me semble compliqué. Avez vous des idées plus simples ?
    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector myVector;
    // on remplit le vector
    ...
    // on crée une "vue" constante
    const std::vector& myView = myVector;


    En C++20 il y a les ranges https://en.cppreference.com/w/cpp/ranges

    Mais passer sa variable en const& est suffisant depuis des décennies.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Merci pour la réponse

    En effet, la solution triviale de retourner une conf ref du container est la bonne solution pour avoir une vue permettant de modifier les objets. Silly me...
    Les ranges sont peut être la bonne solution pour avoir une vue ne permettant pas de modifier le contenu des objets du container, mais malheureusement mon compilo (mingw 7.3.0) n'est pas c++20
    En vérité, je cherche un moyen simple de convertir un vector<object*> en vector<const object*>

Discussions similaires

  1. Créer une vue sous Access 2003
    Par jlvalentin dans le forum Access
    Réponses: 5
    Dernier message: 22/08/2006, 12h29
  2. [9iR2][PL/SQL] Comment créer une vue dans un package ?
    Par mainecoon dans le forum Oracle
    Réponses: 6
    Dernier message: 22/02/2006, 08h10
  3. [requète sql] Créer une vue ordonnée
    Par gangsoleil dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/01/2006, 18h34
  4. Créer une vue avec des requêtes UNION ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/04/2005, 12h37
  5. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22

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