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 :

Retourner un objet depuis une méthode


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 84
    Points : 53
    Points
    53
    Par défaut Retourner un objet depuis une méthode
    Bonjour,

    J'ai une classe messageRetour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public ref class messageRetour
    {
    private:
    	int code;
    	String ^ libelle;
     
    public :
    	int getCode();
    	String ^ getLibelle();
    	void setCode(int myCode);
    	void setLibelle(String ^ myMessage);
    };
    Je voudrai, depuis une procédure d'une autre classe, retourner un objet message retour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    messageRetour myClassTest::doCER()
    {
    	messageRetour myMessageRetour;
     
    	myMessageRetour.setCode(0);
    	myMessageRetour.setLibelle("OK");
     
    	return myMessageRetour;
    }
    J'ai un message d'erreur : error C2440: 'return'*: impossible de convertir de 'messageRetour' en 'messageRetour'
    Qu'Est-ce qui est faux ? Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Je ne crois pas qu'on puisse retourner une ref class par valeur, tu devrais utiliser explicitement des handles:
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    messageRetour^ myClassTest::doCER()
    {
    	messageRetour^ myMessageRetour = gcnew messageRetour();
     
    	//Pourquoi ne pas utiliser des properties ici?
    	myMessageRetour->setCode(0);
    	myMessageRetour->setLibelle("OK");
     
    	return myMessageRetour;
    }

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Partie 2: Beurk! C'est quoi ces getters et setters façon Java? Tu te crois en 1995?
    En C++/CLI, on utilise des propriétés avec les ref class et les value class...
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //messageRetour.h
    public ref class messageRetour
    {
    private:
    	int code;
    	String^ libelle;
     
    public :
    	property int Code { int get(); void set(int myCode); }
    	property String^ Libelle { String^ get(); void set(String^ myMessage); }
    };

    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //messageRetour.cpp
    int messageRetour::Code::get() { return code; }
    void messageRetour::Code::set(int myCode) { code = myCode; }
     
    String^ messageRetour::Libelle::get() { return libelle; }
    void messageRetour::Libelle::set(String^ myMessage) { libelle = myMessage; }

    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //myClassTest.cpp
    messageRetour^ myClassTest::doCER()
    {
    	messageRetour^ myMessageRetour = gcnew messageRetour();
     
    	myMessageRetour->Code = 0;
    	myMessageRetour->Libelle = L"OK";
     
    	return myMessageRetour;
    }
    Quand on programme en C++/CLI, autant le faire proprement!

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    Ben justement, mes cours de C++ datent des années 2000... et je dois m'y remettre avec le temps et le moyens qu'on me donne (on ne fait pas toujours ce qu'on veut dans la vie)

    Merci pour ces explications et pour ces conseils qui me seront bien utiles.

    Si je peut me permettre d'abuser :
    - Dans le messageRetour.h, la classe message retour doit elle être obligatoirement déclare avant la classe myClassTest ?
    - Pourquoi as-tu mis un L à la ligne : myMessageRetour->Libelle = L"OK";
    - Fondamentalement, à quoi sert le handle ?

    Merci !

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Attention, ceci n'est pas du C++, mais du C++/CLI.
    Il s'agit de deux langages différents, aussi différents que le C++ est différent du C.

    Pour tes questions:
    1. Il me semble que oui, mais une mini-déclaration de classe doit suffire pour juste déclarer des paramètres/types de retour/variables de type handle: ref class messageRetour;
    2. "OK" est une chaîne de char (8 bits), L"OK" est une chaîne de wchar_t (16 bits). Les String^ de .Net utilisent des wchar_t (pour être précis, des System::Char), donc autant éviter le coût d'une conversion automatique.
    3. Fondamentalement, en .Net, le handle est un "pointeur managé". C'est par cela qu'on agit sur les types référence (les ref class) en .Net. En fait, pour un type référence, la version non-handle est en fait un sucre syntaxique pour simuler le comportement du C++ normal. Je considère ce sucre syntaxique comme à éviter, car il cache ce qui se passe vraiment sous le capot et rend le code moins compréhensible: Il vaut mieux voir du premier coup d'œil qu'on manipule des types référence.


    Maintenant, tu as deux choix: Rester en C++/CLI et apprendre à programmer dans ce langage, ou convertir ton code en C++ (remplacer les ref class par des classes ordinaires, les String^ par des std::string ou std::wstring, etc.).

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    Un grand merci pour ces explications. J'ai essayé d'utiliser ta technique pour les Get et les Set mais j'ai des erreurs à la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void messageRetour::Code::set(int myCode)() { code = myCode; }
    - error C2091: fonction retournée par la fonction
    - error C2556: 'void (__cdecl *messageRetour::Code::set(int))(void)'*: la fonction surchargée ne diffère que par le type de retour de 'void messageRetour::Code::set(int)'
    -error C2040: 'messageRetour::Code::set'*: les niveaux d'indirection de 'void (__cdecl *(int))(void)' et de 'void (int)' sont différents

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public ref class messageRetour
    {
    private:
    	int code;
    	String^ libelle;
     
    public :
    	property int Code { int get(); void set(int myCode); }
    	property String^ Libelle { String^ get(); void set(String^ myMessage); }
    };

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Oups, j'ai mis une paire de parenthèses en trop à chaque setter. J'ai édité mon message, voici les parenthèses à supprimer:
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    void messageRetour::Code::set(int myCode)() { code = myCode; }

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    Merci !

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

Discussions similaires

  1. [objet] appeler une méthode d'objets contenus dans un tableau (iterator ?)
    Par psychomatt dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/09/2006, 16h28
  2. [POO] Acces aux attributs d'un objet depuis une methode evenement :s
    Par NikoGJ dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/07/2006, 19h01
  3. Réponses: 4
    Dernier message: 08/03/2006, 19h07
  4. [SWING][JList] Réference à un objet depuis une ligne
    Par Invité dans le forum Composants
    Réponses: 12
    Dernier message: 21/02/2006, 10h08
  5. Réponses: 6
    Dernier message: 18/05/2005, 14h04

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