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 :

D'une classe à l'autre

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 42
    Points : 23
    Points
    23
    Par défaut D'une classe à l'autre
    Bonjour,

    EDIT: J'utilise Qt.
    J'ai une classe Window et une classe Ftp.
    J'aimerai pouvoir modifier une image de ma class Window depuis ma class Ftp, sans créer d'objet Window dans ma classe Ftp.

    J'ai tenté, peut-être une ineptie mais bon j'ai tenté quand même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Window::changementStatut(int)

    Mais erreur, il me dit que je ne peux pas l'utiliser sans créer d'objet.

    Bref comment faire quelque chose de ce genre en évitant le problème.

    Merci d'avance.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Déjà, une méthode que tu appelles sans instancier d'objet est une méthode statique (static void method(int param...); ).
    L'image que tu veux modifier doit aussi être un membre statique.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 42
    Points : 23
    Points
    23
    Par défaut
    Oui c'est bien ce qui m'embête.

    Du coup, je me demandais si l'utilisation des signaux et slots n'était pas plus intéressante.

    Mon problème c'est que je n'arrive pas à connecter le signal de ma class Ftp au slot de ma class Window...

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Pourquoi cela t'embête ? Je ne comprends pas ce que t'essayes de faire. Tu ne peux pas agir avec une classe, mais avec des objets instances de cette classe, à moins qu'il ne s'agisse de méthodes statiques.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    A vérifier par d'autres plus expérimentés, mais j'ai une solution (moche, je tient à le préciser).

    Si tu es sûr que ta classe Window ne sera qu'en un seul exemplaire, tu peut en faire un singleton.

    Window.hpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Window {
        public:
            static Window* instance () ;
        public slots:
            void receiveImage (Image image) ;
        protected:
            Window() ; // le constructeur ne sera accessible que via la methode singleton la première fois qu'elle sera appellée
    } ;
    Window.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Window* Window::instance() {
        static Window* _instance = 0 ;
        if (_instance == 0) {
            _instance = new Window() ;
        }
        return _instance ;
    }
     
    // slots
    void Window::receiveImage (Image image) {
        // ici, tu modifie ta Window avec l'image reçue ultérieurement
    }
    Il est alors très facile d'accéder à ta window:

    Ftp.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void Ftp::envoiImage () {
        Image monImage () ;
     
        connect( this, SIGNAL ( sendImage (Image)),
                Window::instance(), // on obtient un pointeur sur l'instance unique de Window.
                SLOT( receiveImage(Image))
                ) ;
        emit sendImage(monImage) ;
    }
    Cependant, ça te demandera de modifier ton code déjà existant pour n'accéder à une Window que via la methode instance().

    En espérant que cela puisse t'aider.

  6. #6
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    L'utilisation du singleton est pratique dans certains cas mais à éviter si ça n'est pas vraiment utile. Je pense que dans ton cas où tu veux seulement connecter un signal, c'est sortir la grosse artillerie pour pas grand chose.

    Tu as probablement un code qui lance tout ça, dans ton main, ou de préférence une classe qui gère ta connexion etc. Ce code là crée à la fois ta mainwindow et le reste de ton application, il connait donc à la fois l'objet mainwindow et l'objet ftp, tu n'as qu'à passer en paramètre de l'un le pointeur de l'autre, et faire ton connect avec.

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    Autant pour moi, c'est effectivement beaucoup plus simple.

    Par contre, par pure curiosité, j'ai effectivement lu qu'il valait mieux y réfléchir à 2 fois avant d'utiliser des singleton et ne le faire qu'uniquement lorsqu'on n'a pas le choix. Mais pourquoi l'éviter ?

    Merci d'avance.

  8. #8
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Au passage il y a plusieurs manières de coder un singleton, la tienne alloue un objet dynamiquement, il ne faut pas oublier de le détruire. Une façon plus automatique : http://cpp.developpez.com/faq/cpp/in...LASS_singleton

    Concernant ta dernière question, elle est plutôt de l'ordre de la conception que de Qt, le sujet a déjà été abordé, c'est un débat ouvert et il n'y a pas de réponse tranchée pour moi. Il y a des cas où c'est utile, et d'autres non, mais en général je trouve que ça diminue la clarté du code (comprendre de l'architecture) donc à utiliser avec modération.

    http://blog.emmanueldeloget.com/inde...e-singletonite
    http://www.developpez.net/forums/d61...-ne-sert-rien/
    en cherchant sur le net tu trouveras des tas d'avis

Discussions similaires

  1. [Débutant] transfert d'objet d'une class à l'autre
    Par patrickvier dans le forum VB.NET
    Réponses: 6
    Dernier message: 11/10/2012, 00h30
  2. Récupération d'objet d'une class à l'autre
    Par mamatt dans le forum Général Java
    Réponses: 7
    Dernier message: 04/01/2008, 16h12
  3. [D7]Méthode non accessible d'une classe à l'autre
    Par ero-sennin dans le forum Delphi
    Réponses: 2
    Dernier message: 20/03/2007, 18h44
  4. Réponses: 2
    Dernier message: 30/12/2006, 14h34
  5. Passer une variable d'une classe à l'autre
    Par Gibou dans le forum C++
    Réponses: 2
    Dernier message: 16/06/2006, 09h38

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