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

Langage C++ Discussion :

Comment retourner un pointeur d'objet dans une struture


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut Comment retourner un pointeur d'objet dans une struture
    Bonjour à tous,

    Je développe une dll contenant des classes et des objets.
    Une fonction qui crée un objet dynamique doit retourner le pointeur de l'objet + autres info.
    Voici la structure déclarée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
        HSMixer G_Mixer;
        HSSTREAM G_Source;
        HANDLE G_Objet;
    } WB_PLAYLIST;
    Puis la méthode de la classe qui doit retourner la structure 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
     
    class Play_list {
     
    private :
        WB_PLAYLIST m_str_playlist;
    ....
     
    public:
        WB_PLAYLIST* Creer();
    ....
    };
     
    WB_PLAYLIST* Play_list::Creer() {
    ....
     
        this->m_str_playlist.G_Mixer = this->m_mixer;
        this->m_str_playlist.G_Source = this->m_source;
        Play_list *const id_objet = this;
        this->m_str_playlist.G_Objet = static_cast<HANDLE>(id_objet);
     
        return &this->m_str_playlist;
    }
    Dans la structure m_str_playlist je récupère bien les infos mixer et source que je souhaite mais dans id_objet j'ai un doute.
    Je ne suis pas certain de récupérer le pointeur sur l'objet. Pour info, je récupère bien une valeur (ex:5726840) qui peut être une adresse.

    Compte-tenu que mon niveau en C++ n'est pas très élevé, je vous sollicite une nouvelle fois pour me donner votre avis sur le code présenté.
    L'utilisation qui est faite du static_cast permet elle de récupérer l'adr de l'objet ? Comment vérifier ?
    Merci de votre aide précieuse.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    c'est quoi la question ? Si this retourne bien this ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Si « Creer » crée un nouvel objet, elle devrait être statique, non ? Et renvoyer un nouvel objet, pas this… Mais quel est l’intérêt par rapport à new ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 558
    Points
    10 558
    Par défaut
    Citation Envoyé par flesenne Voir le message
    L'utilisation qui est faite du static_cast permet elle de récupérer l'adr de l'objet ? Merci de votre aide précieuse.
    Tu as besoin du static_const parce que tu crées une variable locale inutile et constante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WB_PLAYLIST* Play_list::Creer() {
     
        ....
     
        this->m_str_playlist.G_Mixer  = this->m_mixer;
        this->m_str_playlist.G_Source = this->m_source;
        this->m_str_playlist.G_Objet  = this;
     
        return &this->m_str_playlist;
    }
    Après si l'attribut G_Objet n'est pas du même type que this, il faut soit caster soit réfléchir (caster n'est pas une fin en soi )


    Citation Envoyé par flesenne Voir le message
    Comment vérifier ?
    Au debugger , regarder si l'adresse de l'objet et la même qui garnie l'attribut.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    @flesenne, déjà, j'étais pas fan de l'utilisation de classe dans l'API d'une Dll, dans tes posts précédents.
    VS permet de faire ce genre d'acrobatie mais, franchement, à par rendre inutilisable tous les avantages des Dll par rapport à des bibliothèques statiques, et mettre plein de peaux de banane aux débutants, c'est vraiment à éviter comme la peste.
    Si c'est pour rendre une API, POO, fournit un wrapper objet sous forme de .h qui encapsule l'API C (même avec des concepts de POO) de le Dll.

    Il suffit que ta Dll et ton applicatif n'utilise pas la même C-Runtime, ton API avec des pointeurs donc des problèmes de deletes, d'alignement, de padding, etc..., va te faire suer.
    C'est inutilisable si ce n'est pas le même compilateur avec exactement les même réglages, c'est donc totalement inutile d'en faire une Dll.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Généralement, pour une DLL C++, j'y vais façon COM, sans les parties compliquées (pas d'enregistrement, j'exporte juste des fonctions de création retournant des interfaces COM, pas d'histoires de marshaling, etc.)

    Parfois même, une interface ne dérivant même pas de IUnknown (pas de comptage de référence ni de QueryInterface), mais déclarée avec la macro DECLARE_INTERFACE pour être utilisable depuis C et C++.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 15
    Dernier message: 17/01/2008, 17h02
  2. Comment Manipuler des objets dans une liste de type TList ?
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 1
    Dernier message: 02/11/2006, 15h40
  3. Réponses: 1
    Dernier message: 08/09/2006, 17h21
  4. Réponses: 20
    Dernier message: 23/09/2005, 13h50
  5. Comment faire pour faire glisser un objet dans une form ?
    Par Olun dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2005, 17h49

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