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

Discussion :

Hériter de QList

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1
    Par défaut Hériter de QList
    Bonjour,
    Je souhaite faire une classe qui hérite de QList mais lorsque je compile j'ai pleins d'erreurs.
    Voici la classe en question :


    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
    #ifndef MEDIALIST_H
    #define MEDIALIST_H
    #include <QStringList>
    #include "media.h"
     
    class MediaList : public QList<Media>
    {
    public:
        MediaList();
        MediaList(const QList<Media> & other);
        MediaList(const MediaList & other);
        virtual QStringList albums()const;
        virtual QStringList artists()const;
        virtual MediaList filter(const QString &str)const;
        virtual MediaList filterByTitle(const QString &title)const;
        virtual MediaList filterByArtist(const QString &artist)const;
        virtual MediaList filterByAlbum(const QString &album)const;
     
    private:
        QStringList albumList;
        QStringList artistList;
    };
     
    #endif // MEDIALIST_H
    Le cpp :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    #include "core/medialist.h"
     
    MediaList::MediaList() : QList()
    {
     
    }
     
    MediaList::MediaList(const QList<Media> &other) : QList(other)
    {
        foreach(const Media &m,other)
        {
            if(!artistList.contains(m.artist()))
                artistList.append(m.artist());
            if(!albumList.contains(m.album()))
                albumList.append(m.album());
        }
    }
     
    MediaList::MediaList(const MediaList &other) : QList(other)
    {
        this->artistList = other.artistList;
        this->albumList = other.albumList;
    }
     
    QStringList MediaList::albums() const
    {
        return albumList;
    }
     
    QStringList MediaList::artists() const
    {
        return artistList;
    }
     
    MediaList MediaList::filter(const QString &str) const
    {
        MediaList list;
        foreach(const Media &m,filterByTitle(str))
        {
            if(!list.contains(m))
                list.append(m);
        }
        foreach(const Media &m,filterByArtist(str))
        {
            if(!list.contains(m))
                list.append(m);
        }
        foreach(const Media &m,filterByAlbum(str))
        {
            if(!list.contains(m))
                list.append(m);
        }
        return list;
    }
     
    MediaList MediaList::filterByTitle(const QString &title) const
    {
        MediaList list;
        foreach(const Media &m,this)
        {
            if(m.title() == title)
                list.append(m);
        }
        return list;
    }
     
    MediaList MediaList::filterByArtist(const QString &artist) const
    {
        if(!artistList.contains(artist))
            return MediaList();
     
        MediaList list;
        foreach(const Media &m,this)
        {
            if(m.artist() == artist)
                list.append(m);
        }
        return list;
    }
     
    MediaList MediaList::filterByAlbum(const QString &album) const
    {
        if(!albumList.contains(album))
            return MediaList();
     
        MediaList list;
        foreach(const Media &m,this)
        {
            if(m.album() == album)
                list.append(album);
        }
        return list;
    }
    Et les erreurs :

    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
    In*file*included*from*../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qiterator.h:45:0,
    *****************from*../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qlist.h:45,
    *****************from*../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/QList:1,
    *****************from*../Player/core/medialist.h:3,
    *****************from*../Player/core/medialist.cpp:1:
    ../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qglobal.h:*In*instantiation*of*'QForeachContainer<const*MediaList**const>':
    ../Player/core/medialist.cpp:59:5:***instantiated*from*here
    ../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qglobal.h:2341:32:*error:*'const*MediaList**const'*is*not*a*class,*struct,*or*union*type
    ../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qglobal.h:2341:35:*error:*'const*MediaList**const'*is*not*a*class,*struct,*or*union*type
    ../Player/core/medialist.cpp:*In*member*function*'virtual*MediaList*MediaList::filterByTitle(const*QString&)*const':
    ../Player/core/medialist.cpp:59:5:*error:*'class*QForeachContainer<const*MediaList**const>'*has*no*member*named*'i'
    ../Player/core/medialist.cpp:59:5:*error:*'class*QForeachContainer<const*MediaList**const>'*has*no*member*named*'e'
    ../Player/core/medialist.cpp:59:5:*error:*'class*QForeachContainer<const*MediaList**const>'*has*no*member*named*'i'
    ../Player/core/medialist.cpp:59:5:*error:*'class*QForeachContainer<const*MediaList**const>'*has*no*member*named*'i'
    ../Player/core/medialist.cpp:*In*member*function*'virtual*MediaList*MediaList::filterByArtist(const*QString&)*const':
    ../Player/core/medialist.cpp:73:5:*error:*'class*QForeachContainer<const*MediaList**const>'*has*no*member*named*'i'
    ../Player/core/medialist.cpp:73:5:*error:*'class*QForeachContainer<const*MediaList**const>'*has*no*member*named*'e'
    ../Player/core/medialist.cpp:73:5:*error:*'class*QForeachContainer<const*MediaList**const>'*has*no*member*named*'i'
    ../Player/core/medialist.cpp:73:5:*error:*'class*QForeachContainer<const*MediaList**const>'*has*no*member*named*'i'
    ../Player/core/medialist.cpp:*In*member*function*'virtual*MediaList*MediaList::filterByAlbum(const*QString&)*const':
    ../Player/core/medialist.cpp:87:5:*error:*'class*QForeachContainer<const*MediaList**const>'*has*no*member*named*'i'
    ../Player/core/medialist.cpp:87:5:*error:*'class*QForeachContainer<const*MediaList**const>'*has*no*member*named*'e'
    ../Player/core/medialist.cpp:87:5:*error:*'class*QForeachContainer<const*MediaList**const>'*has*no*member*named*'i'
    ../Player/core/medialist.cpp:87:5:*error:*'class*QForeachContainer<const*MediaList**const>'*has*no*member*named*'i'
    In*file*included*from*../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qiterator.h:45:0,
    *****************from*../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qlist.h:45,
    *****************from*../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/QList:1,
    *****************from*../Player/core/medialist.h:3,
    *****************from*../Player/core/medialist.cpp:1:
    ../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qglobal.h:*In*constructor*'QForeachContainer<T>::QForeachContainer(const*T&)*[with*T*=*const*MediaList**const]':
    ../Player/core/medialist.cpp:59:5:***instantiated*from*here
    ../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qglobal.h:2338:81:*error:*using*invalid*field*'QForeachContainer<T>::i'
    ../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qglobal.h:2338:81:*error:*request*for*member*'begin'*in*'((QForeachContainer<const*MediaList**const>*)this)->QForeachContainer<const*MediaList**const>::c',*which*is*of*non-class*type*'const*MediaList**const'
    ../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qglobal.h:2338:81:*error:*using*invalid*field*'QForeachContainer<T>::e'
    ../QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qglobal.h:2338:81:*error:*request*for*member*'end'*in*'((QForeachContainer<const*MediaList**const>*)this)->QForeachContainer<const*MediaList**const>::c',*which*is*of*non-class*type*'const*MediaList**const'
    make:*Leaving*directory*`/home/andry/Player-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK__Release'
    make:*****[medialist.o]*Error*1
    Je n'ai aucune idée de ou ça pourrait venir.
    Merci d'avance pour vos réponses.

    Edit: Résolu fallait mettre *this et pas this dans les foreach

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    A vrai dire, tu ne devrais pas hériter de QList...

    D'ailleurs, en C++, tu ne devrais jamais hériter d'un conteneur quel qu'il soit

    La raison principale, c'est que le destructeur de QList (car c'est ce qui nous intéresse) n'est pas virtuel, ce qui fait que si tu fais passer un pointeur vers une instance de ta classe dérivée pour un pointeur sur QList et que tu essaye d'invoquer delete dessus, seul le destructeur de QList sera appelé, avec le gros risque que les données propres à ta classe dérivée ne soient pas correctement détruites

    Une autre raison beaucoup plus "conceptuelle" celle-là est qu'il faut respecter certaines règles issues de la "programmation par contrat" quand on envisage l'héritage :
    1. Les pré conditions ne peuvent pas être renforcées dans la classe dérivée
    2. Les post condtions ne peuvent pas être allégées dans la classe dérivée
    3. les invariants de la classe de base doivent etre valides pour la classe dérivée
    Or, si tu as une liste triée, tu as une précondition qui devient implicite : la liste est... triée avant de faire quoi que ce soit.

    Tu as donc une pré conditon qui existe dans la classe dérivée et qui n'existe pas dans la classe de base.

    Et, pour ton malheur, le fait d'avoir une pré conditon est plus restrictif que le fait de ne pas en avoir

    Enfin, je vais être honnête avec toi, mais je ne vois pas la raison qui peut t'inciter à mettre une liste d'album et une liste d'artiste dans une liste de média

    Dans une liste de médias, on met... ben des média...

    Et comme un média, c'est déjà un nom d'album, une série de chansons auxquelles est chaque fois rattaché un artiste (même si c'est le même artiste pour toutes les chansons) , si on a la liste des média, on a toutes les informations qui peuvent nous intéresser d'une manière ou d'une autre.

    Ce qui peut être intéressant, c'est, selon tes besoins, d'envisager de travailler avec un conteneur "multi index", qui aura un index "primaire" (unique) et autant d'indexes "secondaires" (potentiellement multiple) que ce que tu peux souhaiter ou de prévoir des processus qui trieront / sélectionneront les médias qui t'intéressent en fonction de certains critères

    Pour la première solution, je pense, entre autre, à boost::multi_index, pour la seconde, ce pourraient être des classes / fonctions qui remplissent des QList<Media*>(ben oui, ce serait trop bête de copier sans fin les médias ) temporaires en fonction de tes besoins, chaque pointeur de Media pointant... sur le média correspondant dans ta liste "de référence" (attention, il ne faut absolument pas invoquer delete sur ces pointeurs et ils sont invalidés dés que tu agis d'une manière ou d'une autre sur la liste de référence ).

    La première solution correspond, finalement, exactement à tes besoins et la deuxième présente, malgré tout, l'énorme avantage de déléguer les responsabilité : la "liste de référence" de média se contente... de contenir les médias (en ajouter, en retirer) et toute la logique "connexe" (tri selon différents critères, recherche, sélection) est déportée dans une classe qui n'a... que cela à faire

    Et, si un jour, tu te rends compte qu'il te faut un critère de tri supplémentaire (par exemple, sur la durée totale du média), il te suffira de rajouter une classe qui le prendra en charge, et tu respecteras, en plus, le principe "ouvert / fermé"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. [Héritage] Hériter de TextComponent impossible
    Par soad dans le forum Composants
    Réponses: 6
    Dernier message: 01/12/2005, 08h02
  2. Hériter de TList
    Par NotANumber dans le forum Langage
    Réponses: 10
    Dernier message: 23/11/2005, 18h35
  3. Hériter de TList
    Par NotANumber dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 22/11/2005, 18h03
  4. Réponses: 2
    Dernier message: 05/07/2005, 18h22
  5. Réponses: 7
    Dernier message: 25/03/2005, 14h05

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