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 :

Passage par référence entre class


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    informaticien géomètre
    Inscrit en
    Juillet 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : informaticien géomètre
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Juillet 2012
    Messages : 20
    Par défaut Passage par référence entre class
    Bonjour à tous

    Je me trouve face à un cas que je ne comprend pas. Si quelqu'un pouvait éclairer ma lanterne, ce serait super.
    Je travaille avec Qt creator.
    Un peu de code pour mieux comprendre le problème :

    fichier Images.h // class que plusieurs parties du programme peut utiliser
    fichier Images.cpp

    fichier FusionOBJ.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
    #include "Images.h"
     
    class FusionOBJ : public QMainWindow {
        Q_OBJECT
    public:
        FusionOBJ(Images & imgStock);
        /* ... */
    private:
        QAction* objFus;
        Images & m_imgStock;
        /* ... */
    private slots:
        void loadObjFus();
        /* ... */
    }

    fichier FusionOBJ.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
    #include "FusionOBJ.h"
     
    FusionOBJ::FusionOBJ(Images &imgStock) : m_imgStock(imgStock) {
        /* ... */
        objFus = new QAction(QIcon(":/FUS.png"), "OBJ de fusion", this);
        connect(objFus, SIGNAL(triggered()), this, SLOT(loadObjFus()));
        btnFusObj->addAction(objFus);
        /* ... */
        /* ici, la référence m_imgStock pointe bien vers la class Images */
    }
     
    void FusionOBJ::loadObjFus() {
        /* ici, la référence m_imgStock pointe dans les choux !! */
    }

    Quand je lance le programme tout se passe bien. ma référence m_imgStock de la class FusionOBJ pointe bien la class Images.
    Mais quand je clique sur le bouton objFus pour lancer la méthode loadObjFus, c'est comme si il s'agissait d'une nouvelle instance de la class FusionOBJ car la référence m_imgStock n'est plus initialisée.

    Quelle est la boulette que je fais ?
    merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Par défaut
    je n'utilise pas Qt, mais peut être que l'ordre de construction de ta classe est :

    "QMainWindow",
    "private slots:..."
    "m_imgStock(imgStock)"
    le reste du constructeur
    ?

    Si tu as une fonction hors "private slots", as tu acces a ton image ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    salut,

    Une erreur potentielle (mais classique), c'est que ton Image est détruite entre la construction de ton instance de FusionObj et le click. Et de fait, ta référence pointe vers une zone qui existe plus et c'est la cata.
    Dernière modification par LittleWhite ; 16/07/2012 à 13h32.

  4. #4
    Membre averti
    Homme Profil pro
    informaticien géomètre
    Inscrit en
    Juillet 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : informaticien géomètre
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Juillet 2012
    Messages : 20
    Par défaut
    Merci pour vos pistes de réflexion

    @superZozo : J'ai tenté le réagencement des déclarations, sans succès.
    J'ai tenté également l'appel hors 'slots' (très bonne idée au passage), et là encore la référence est dans les choux.

    @galerien69 : Mon image est bien présente dans la classe. En fait je n'ai pas prévu de destruction possible pour l'instant. La classe est détruite à la fermeture du programme.
    Mais ça m'a donné l'idée de définir mon pointeur dans la classe FusionOBJ, puisque c'est elle qui dispatch la référence à qui en a besoin.
    Sauf que nouveau problème...

    fichier .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "Images.h"
     
    class FusionOBJ : public QMainWindow {
        Q_OBJECT
    public:
        FusionOBJ();
        /* ... */
    private:
        Images & m_imgStock;
        /* ... */
    }
    fichier .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "FusionOBJ.h"
     
    FusionOBJ::FusionOBJ() {
        /* ... */
        Images m_imgStock;
        m_imgStock.test = 100;	// variable 'bidon' pour tester le fonctionnement
        /* ... */
    }
    J'obtiens le message d'erreur : uninitialized reference member 'FusionOBJ::m_imgStock'
    Y'a comme qui dirait que ça se mord la queue ! Si je ne peux pas initialiser dans le constructeur... je suis coincé, non ?

    Je précise que je découvre le C++ et que je ne maitrise pas encore toutes les subtilités. Je passe peut-être à coté de quelque chose d'évident pour vous.
    Encore merci pour l'aide.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ben tu as toi même compris.
    L'initialisation se fait avec les "deux points"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FusionOBJ::FusionOBJ():_imgStock(Images()){
     //code execute apres l'initialisation des variables
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mon image est bien présente dans la classe.
    Donc oui et non. Dans ta classe (plus précisément ton instance de classe), tu as une référence vers l'image (qui a été créée en dehors de ta classe). Que se passe-t-il si en dehors ta "vraie" image est supprimée ou modifiée.

    Typiquement,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(){
    Images* img=new Images();
    FusionOBJ fu(*img);
    delete img;
    //ici fu._imgStock tente dacceder a une zone mémoire désallouée
    }

  6. #6
    Membre averti
    Homme Profil pro
    informaticien géomètre
    Inscrit en
    Juillet 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : informaticien géomètre
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Juillet 2012
    Messages : 20
    Par défaut
    merci galerien69

    Je n'avais pas compris que... j'avais compris

    Mais ça y est j'ai tilté en voyant ton message. Effectivement j'initialisais ma référence dans la méthode 'parent' qui provoquait le show de ma class FusionOBJ. Donc dès la fenètre affichée, sortie de la méthode d'appel et donc fin de la portée de ma référence, d'où le pointage dans les choux.

    Un grand merci pour ta patience, tu m'enlèves une belle épine du pied. D'autant que c'est pour le boulot et que ça commençait à urger.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 31/01/2012, 23h11
  2. Réponses: 4
    Dernier message: 26/12/2009, 20h48
  3. passage de paramètres par référence entre fonctions ?
    Par cabsen dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/05/2009, 10h47
  4. Réponses: 8
    Dernier message: 09/08/2007, 17h34
  5. classe vecteur3D, passage par référence
    Par deubelte dans le forum C++
    Réponses: 7
    Dernier message: 21/05/2007, 14h18

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