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 :

[generaliser un parametre]mettre en type un objet parent?


Sujet :

C++

  1. #1
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut [generaliser un parametre]mettre en type un objet parent?
    bonjours, je voudrait savoir si on peut, comme j'ai vu dans les etudes de cas que 'jai eu en cours...
    ...
    ...passer des paramettre comme ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    classe A
    classe B : public A
     
    function toto(A *foo)
     
    ...
    ...
    b = new B()
    toto(b)
    en gros, peut on mettre en paramettre un objet herité d'une classe pouvant etre mis en parametre...
    je sait pas trop comment formuler cette question :'(

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ben oui, on peut, c'est le principe du polymorphisme

  3. #3
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    donc, cetet erreure peut etre corrigée ?

    no matching function for call to `MySocketServeur::onConnexion(wxSocketEvent&, vncPeuThreadeFrm&)'
    candidates are: wxSocketBase* MySocketServeur::onConnexion(wxSocketEvent&, wxObject*)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //on est dans une instance de vncPeuThreadeFrm herité de wxFrame heritant de wxObject
     MySocketServeur *objSoCKSER = new MySocketServeur();
     sockBaseImg = objSoCKSER->onConnexion(event, *this);

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est surtout qu'il veut un wxObject* et que tu lui donne un *this, donc une instance dérivée de wxObject.
    C'est this qu'i faut mettre.

  5. #5
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    ca a un peu evolué, je re-resume :

    mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //on est dans une instance de vncPeuThreadeFrm herité de wxFrame heritant de wxEvtHandler
        MySocketServeur *objSoCKSER = new MySocketServeur();
        sockBaseImg = objSoCKSER->onConnexion(event, this);
    et mes erreures :
    no matching function for call to `MySocketServeur::onConnexion(wxSocketEvent&, vncPeuThreadeFrm* const)'
    candidates are: wxSocketBase* MySocketServeur::onConnexion(wxSocketEvent&, wxEvtHandler)
    donc, ca me semble... incomprehensible, lol

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Même problème mais dans l'autre sens : cette fois tu lui passes un pointeur alors qu'il attend un objet...

  7. #7
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par Loulou24
    Même problème mais dans l'autre sens : cette fois tu lui passes un pointeur alors qu'il attend un objet...
    dsl, mais... y a t'il un moyen de lui passer un objet?
    sachant que je suis dans cet objet lorsque je fait cet appel...

    this, c'est toujours un pointeur, c'est bien ca?
    y'a pas un transtypage possible?

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Oui, this est un pointeur vers l'objet courant. Disponible qu'après le constructeur, quand l'objet est construit
    En fait, tu as oublié d'indiquer dans la déclaration de ta fonction que tu veux un pointeur vers une instance qu'une instance - sans quoi tu perdrais toutes les spécifités de ta classe perso -

  9. #9
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par Miles
    Oui, this est un pointeur vers l'objet courant. Disponible qu'après le constructeur, quand l'objet est construit
    En fait, tu as oublié d'indiquer dans la déclaration de ta fonction que tu veux un pointeur vers une instance qu'une instance - sans quoi tu perdrais toutes les spécifités de ta classe perso -
    en fait, c'est parceque je doit passer en paramettre d'une autre finction, un objet et non un pointeur (je doit donner en parametre un wxEvtHandler, et non un &wxEvtHandler ou un *wxEvtHandler (cf la ligne en rouge dans le code qui suit)


    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
    /*
     * appelé quand une socket distante tenet de communiquer, cette methode crée une soket serveur, afin d'etablir une connexion
     */
    wxSocketBase *MySocketServeur::onConnexion(wxSocketEvent& event, wxEvtHandler eventHandler)
    {
        //le socket base créé enverra les images
    
         sockBaseImg = event.GetSocket();
    
        
    
        
        // Accepte une nouvelle connection si il y en a une dans la file d'attente
        // sinon, on sort. on utilise accept(false) pour effectuer une acceptation 
        //non blocante pour le GUI (au cas ou finalement il n'y ait rien dasn la 
        //file d'attente)
    
    if (event.GetSocketEvent() == wxSOCKET_CONNECTION ) {
     //tout mettre ici                             
    }                              
        
              
        wxSocketServer *socketSrv;
        sockBaseImg = socketSrv->Accept(false);
        
    
        
        sockBaseImg->SetEventHandler(eventHandler, 8001);  
        sockBaseImg->SetFlags(wxSOCKET_WAITALL);//on ne recevra d'evenements de output que quand tout aura ete transmis (entre temps, ca ne sert a rien de créer une nouvelle image)
        sockBaseImg->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG ); //on gere pas encore les output
        sockBaseImg->Notify(true); //pour recevoir les evenements :)
        return sockBaseImg;
    }

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La fonction wxSocketBase::SetEventHandler prend en paramètre une référence, tu peux donc en faire autant.

    Prendre ce paramètre par valeur n'aurait aucun intérêt, puisque cette classe a pour but d'être utilisée polymorphiquement. Or le polymorphisme n'est possible que via une référence ou un pointeur ; en passant une copie tu perds le type dynamique de ton objet. Et puis ça risque même d'être impossible, pour peu que la classe wxEvtHandler soit abstraite.

    Bref :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wxSocketBase *MySocketServeur::onConnexion(wxSocketEvent& event, wxEvtHandler& eventHandler)

  11. #11
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    vi...

    c'est comme ca que j'avait essayé au debut, mais...
    non-lvalue in unary `&'
    quand je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sockBaseImg = objSoCKSER->onConnexion(event, &this);
    (ca veut pas que je mette "&this")

    Citation Envoyé par moi meme
    dsl, mais... y a t'il un moyen de lui passer un objet?
    sachant que je suis dans cet objet lorsque je fait cet appel...

    this, c'est toujours un pointeur, c'est bien ca?
    y'a pas un transtypage possible?

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    &this est l'adresse de this, autrement dit un double-pointeur. Il n'y a pas de syntaxe pour passer une référence, ce ne sont que des alias (d'autres noms pour une même variable). Donc passe *this et ça ira.

    Tu devrais peut-être relire un bon cours, au moins sur le chapitre des pointeurs et références (et polymorphisme), ça ne fait pas de mal

  13. #13
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par Loulou24
    Tu devrais peut-être lire un bon cours, au moins sur le chapitre des pointeurs et références (et polymorphisme), ça ne fait pas de mal
    youhou!! ca compile (et ca plante, lol)!

    merci beacoup!!!
    (j'ai conscience de mes lacunes, mais j'ai po le temps de les combler avant mon exam!)

    merci encore!!!!

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    (et ca plante, lol)!
    Tu as bien modifié la signature de ta fonction, de manière à ce qu'elle prenne une référence et non plus une copie de wxEvtHandler ?

  15. #15
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par Loulou24
    Tu as bien modifié la signature de ta fonction, de manière à ce qu'elle prenne une référence et non plus une copie de wxEvtHandler ?
    oui, j'ai ca maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wxSocketBase *onConnexion(wxSocketEvent& , wxEvtHandler&);
    et comme appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     MySocketServeur *objSoCKSER = new MySocketServeur();
     sockBaseImg = objSoCKSER->onConnexion(event, *this);
    je devrait reussir a me debrouiller maintenant, merci encore

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/04/2019, 18h52
  2. [Débutant][Conception] Mettre à jour un objet de type classe
    Par Sylvester dans le forum Général Java
    Réponses: 19
    Dernier message: 09/02/2006, 17h59
  3. [hibernate] Effacer un type d'objet
    Par nighma dans le forum Hibernate
    Réponses: 10
    Dernier message: 29/12/2005, 10h23
  4. Initialisation d'un type d'objet
    Par fdraven dans le forum Oracle
    Réponses: 3
    Dernier message: 28/10/2005, 11h05
  5. [Appli] Recherche d'un type d'objet précis pour interface
    Par superpatate dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 05/08/2005, 12h02

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