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éritage QWidget, is implicitly deleted

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Auto-didacte lycéen
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auto-didacte lycéen

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Par défaut Héritage QWidget, is implicitly deleted
    Bonjour, j'ai un problème avec mon code. Il semblerait que cela est du à un ajout d'héritage sur une de mes classes ( Creature1 )
    Après différentes recherches sur internet :
    https://stackoverflow.com/questions/...in-this-contex
    (J'ai exactement la même erreur que ce lien mais je ne comprend pas comment résoudre mon code)

    Il semblerait que c'est une histoire de copie de constructeur qui est passer directement et pas sous forme de pointeur.

    Le code de la class qui pose problème :

    Le Creature1.h

    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
     
    #ifndef CREATURE1_H
    #define CREATURE1_H
     
    #include <QWidget>
     
    #include <vector>
    #include "Food.h"
     
     
    class Creature1 : public QWidget
    {
    public:
        Creature1(QWidget *parent = nullptr);
        Creature1(std::vector<Creature1> *rangement1);
     
        void setTab(std::vector<Creature1> *a, std::vector<Food> *b);
        void mitose();
        void mourrir();
        void mort();
        bool survivre();
     
        ~Creature1();
     
    signals:
     
    public slots:
     
    private:
     
        float m_dead;
        float m_reproduce;
        std::vector <Creature1> *m_rangement;
        std::vector <Food> *m_food;
    };
     
    #endif // CREATURE1_H
    Le Creature1.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
     
    #include "creature1.h"
    #include "iostream"
    #include <vector>
    #include <cstdlib>
    #include <stdlib.h>
    #include <ctime>
     
     
    using namespace std;
     
    Creature1::Creature1(QWidget *parent) : QWidget(parent)
    {
        m_reproduce = 10;
        m_dead = 5;
        srand(static_cast<unsigned int>(time(nullptr))); // Pour avoir un vrai aléatoire qui depend du temps
    }
     
    Creature1::Creature1(std::vector<Creature1> *rangement1) : m_rangement(rangement1)
    {
     
    }
    void Creature1::setTab(std::vector<Creature1> *a, std::vector<Food> *b)
    {
        m_rangement = a;
        m_food = b;
    }
     
    void Creature1::mitose()
    {
        if((*m_rangement).size() == 1 && rand()%100 < 50)
        {
            //m_rangement->push_back(m_rangement->at(0));//ICI
        }
        else if(rand()%100 <= m_reproduce && m_food->size() >= 2) // Si on se reproduit
        {
            //m_rangement->push_back(m_rangement->at(0));//ICI
            m_food->pop_back();
        }
    }
    void Creature1::mourrir()
    {
        if(rand()%100 <= m_dead) // si on meurt
        {
            this->mort();
        }
    }
    void Creature1::mort()
    {
        if((*m_rangement).empty())
            {
     
            }
            else
            {
                (*m_rangement).pop_back();
            }
    }
     
    bool Creature1::survivre()
    {
        if(!(m_food->empty())) // A de la bouffe
        {
            m_food->pop_back();
            return true;
        }
        else
        {
            this->mort();
            return false;
        }
    }
    Creature1::~Creature1()
    {
        //dtor
    }
    Après plusieurs recherche le problème viens des lignes marques avec le commentaire //ICI
    J'ai aussi essayer à la place de m_rangement->at(0)
    Creature1() et *this
    Dans chaque cas le but est de passer une instance de ma classe donc soit en la créant avec un constructeur(Creature1()) où en la faisant répliquer par elle même (*this)

    Je pense que j'ai une faiblesse théorique qui m'empêche de vraiment comprendre mon erreurs et donc de la corriger donc si quelqu'un veut bien m'aiguiller ?


    Je précise que le but ici est de permettre à ma class d'hériter de QWidget ou de QLabel mais le problème est le même.
    Voilà je crois que j'ai tout dit merci

  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,

    Ajoute la ligne Q_OBJECT; juste après l'accolade ouvrante de définition de ta classe...

    Tu dois donc avoir quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Creature1 : public QWidget
    {
        Q_OBJECT;
    public:
    Voilà qui devrait résoudre ton problème
    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

  3. #3
    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
    Ouppsss... Après avoir lu la réponse sur stackoverflow : ton erreur est due au fait que tu essayes, de toutes évidence, à créer une copie d'une de tes créatures. Pas de bol, Qt (comme toute bonne bibliothèque ayant recours à l'héritage public, d'ailleurs) empêche ce genre de chose, car tout ce qui dérive de QWidget a sémantique d'entité; parce que l'on ne veut surtout pas qu'il y ait, à un instant T de l'exécution, deux instances d'une classe qui présente exactement les mêmes valeurs internes (ce qui serait la galère pour arriver à les distinguer )

    Pour résoudre ton problème:
    1. vérifie que toutes les instances de Creature1 soient bien déclarées comme des pointeurs (même et surtout si tu en crées une collection, comme std::vector<Creature1>
    2. assures toi que toutes les instances de Creature1 soient bel et bien créée en ayant recours à l'allocation dynamique ( ptr = new Creature1
    3. assures toi que le passage d'un objet de type Creature1 comme paramètre d'une fonction se fasse bien par pointeur ou par référence
    4. assures toi que le renvoi d'un objet de type Creature1 comme valeur de retour d'une fonction se fasse bien par pointeur ou par référence
    5. a priori, le message d'erreur devrait t'indiquer le nom du fichier ainsi que la ligne à laquelle l'erreur survient... tu peux ignorer tous les fichiers qui ne sont pas à toi pour te concentrer sur la première erreur qui apparait dans un de tes fichiers
    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

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Auto-didacte lycéen
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auto-didacte lycéen

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Par défaut
    Merci d'avoir répondu ! Même si je n'arrive à strictement aucun résultat je crois que ce problème est au dessus de mes compétences...
    J'ai essayer différentes chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Creature1 *lol = new Creature1();
            m_rangement->push_back(lol);
    Mais j'arrive au même endroit, pourtant là pour moi je donne bien un pointeur. Mais du coup pour moi je ne respecte pas le type de mon vector ?
    C'est à dire pour moi je dois mettre un objet de type Creature1 pour pouvoir faire fonctionner mon code.
    Donc je ne comprend tout simplement pas comment je peux ajouter des éléments à mon vector...

    Je re réfléchirais demain mais après 1 h 30 rien ne viens désoler.

    Merci encore pour l'aide

  5. #5
    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
    Montre nous le code, au moins de l'ensemble du fichier qui provoque l'erreur, et indique nous également l'ensemble des erreurs que tu obtiens
    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

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Auto-didacte lycéen
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auto-didacte lycéen

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Par défaut
    D'accord merci donc le code :

    Creature.h

    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
     
    #ifndef CREATURE1_H
    #define CREATURE1_H
     
    #include <QWidget>
     
    #include <vector>
    #include "Food.h"
     
     
    class Creature1 : public QWidget
    {
    public:
        Creature1(QWidget *parent = nullptr);
        Creature1(std::vector<Creature1> *rangement1);
     
        void setTab(std::vector<Creature1> *a, std::vector<Food> *b);
        void mitose();
        void mourrir();
        void mort();
        bool survivre();
     
        ~Creature1();
     
    signals:
     
    public slots:
     
    private:
     
        float m_dead;
        float m_reproduce;
        std::vector <Creature1> *m_rangement;
        std::vector <Food> *m_food;
    };
     
    #endif // CREATURE1_H

    Creature.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
     
    #include "creature1.h"
    #include "iostream"
    #include <vector>
    #include <cstdlib>
    #include <stdlib.h>
    #include <ctime>
     
     
    using namespace std;
     
    Creature1::Creature1(QWidget *parent) : QWidget(parent)
    {
        m_reproduce = 10;
        m_dead = 5;
        srand(static_cast<unsigned int>(time(nullptr))); // Pour avoir un vrai aléatoire qui depend du temps
    }
    Creature1::Creature1(vector<Creature1> *rangement1) : m_rangement(rangement1)
    {
        m_reproduce = 10;
        m_dead = 5;
        srand(static_cast<unsigned int>(time(nullptr))); // Pour avoir un vrai aléatoire qui depend du temps
    }
     
    void Creature1::setTab(std::vector<Creature1> *a, std::vector<Food> *b)
    {
        m_rangement = a;
        m_food = b;
    }
     
    void Creature1::mitose()
    {
        if((*m_rangement).size() == 1 && rand()%100 < 50)
        {
            Creature1 *lol = new Creature1();
            m_rangement->push_back(lol);
        }
        else if(rand()%100 <= m_reproduce && m_food->size() >= 2) // Si on se reproduit
        {
            //m_rangement->push_back(m_rangement->at(0));//ICI
            m_food->pop_back();
        }
    }
    void Creature1::mourrir()
    {
        if(rand()%100 <= m_dead) // si on meurt
        {
            this->mort();
        }
    }
    void Creature1::mort()
    {
        if((*m_rangement).empty())
            {
     
            }
            else
            {
                (*m_rangement).pop_back();
            }
    }
     
    bool Creature1::survivre()
    {
        if(!(m_food->empty())) // A de la bouffe
        {
            m_food->pop_back();
            return true;
        }
        else
        {
            this->mort();
            return false;
        }
    }
    Creature1::~Creature1()
    {
        //dtor
    }
    Je sais que les erreurs sont dus à cause de ces endroits (tous situé dans le Créature.cpp ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Creature1::Creature1(vector<Creature1> *rangement1) : m_rangement(rangement1)
    {
        m_reproduce = 10;
        m_dead = 5;
        srand(static_cast<unsigned int>(time(nullptr))); // Pour avoir un vrai aléatoire qui dépend du temps
    }
    Ce constructeur est appeler de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_rangement1.push_back(Creature1(&m_rangement1));
    Les autres endroits sources d'erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            Creature1 *lol = new Creature1();
            m_rangement->push_back(lol);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     m_rangement->push_back(m_rangement->at(0));//ICI

    Il y a 75 erreurs (toutes liées à ce petit problème, si j'enlève ces bouts de code je tombe à 0 erreur ) :

    Je met les erreurs marquées par les panneaux rouges

    C:\Qt\Tools\mingw482_32\i686-w64-mingw32\include\c++\ext\new_allocator.h:120: erreur : use of deleted function 'Creature1::Creature1(const Creature1&)'
    { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
    ^

    C:\Qt\5.3\mingw482_32\include\QtWidgets\qwidget.h:728: erreur : 'QWidget::QWidget(const QWidget&)' is private
    Q_DISABLE_COPY(QWidget)
    ^

    C:\Users\Ounaye\Desktop\Informatique\Codage\QT\Test2Creature1\creature1.h:10: erreur : within this context
    class Creature1 : public QWidget
    ^

    C:\Users\Ounaye\Desktop\Informatique\Codage\QT\Test2Creature1\creature1.h:10: erreur : use of deleted function 'QWidget::QWidget(const QWidget&)'

    C:\Qt\5.3\mingw482_32\include\QtWidgets\qwidget.h:728: erreur : declared here
    Q_DISABLE_COPY(QWidget)
    ^

    C:\Qt\Tools\mingw482_32\i686-w64-mingw32\include\c++\ext\new_allocator.h:120: erreur : use of deleted function 'Creature1::Creature1(const Creature1&)'
    { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
    ^

    C:\Qt\Tools\mingw482_32\i686-w64-mingw32\include\c++\bits\stl_construct.h:75: erreur : use of deleted function 'Creature1::Creature1(const Creature1&)'
    { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
    ^

    Voilà j'ai essayer d'être le plus clair et le moins lourd possible, merci encore une fois de m'accorder du temps
    Bon courage pour y comprendre quelque chose

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

Discussions similaires

  1. Problème d'héritage de QWidget
    Par squallmrs dans le forum Qt
    Réponses: 3
    Dernier message: 11/10/2010, 03h38
  2. Multi-héritage de QWidget
    Par scheme dans le forum Qt
    Réponses: 5
    Dernier message: 03/09/2010, 11h56
  3. Multi héritage Qt -> multi héritage de QWidget ?
    Par gassi64 dans le forum Débuter
    Réponses: 2
    Dernier message: 24/07/2009, 12h33
  4. delete héritage structure
    Par demss dans le forum C++
    Réponses: 12
    Dernier message: 17/03/2008, 23h31
  5. surcharge operateur delete et héritage
    Par Hervé dans le forum C++
    Réponses: 5
    Dernier message: 29/03/2006, 14h59

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