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 :

Variable de type struct dans liste d'initialisation d'un constructeur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 49
    Par défaut Variable de type struct dans liste d'initialisation d'un constructeur
    Bonjour,

    J'ai une variable de type struct définie comme suit dans le fichier d'entête de la classe où je souhaite l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct device_t
    {
        uint8_t id;
        uint8_t status;
    };
    Ma classe est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class HomeDevice
    {
    private:
        device_t _device;
     
    public:
        HomeDevice();
        HomeDevice(uint8_t deviceId);
    };
    Dans le constructeur par défaut, si j’essaie d'initialiser l'id du device dans la liste d'initialisation, j'ai une erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    HomeDevice::HomeDevice() : _device.id(0)
    {
     
    }
    Est-ce la syntaxe qui n'est pas la bonne, ou n'est il tout simplement pas possible d'initialiser une variable de type struct de cette façon?

    Merci.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    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 766
    Par défaut
    Tu as plusieurs choix

    Le constructeur dans la structure (ajout du C++)
    En C++, la différence entre 1 structure et 1 classe, c'est l'encapsulation : public vs private.

    Avec 1 valeur par défaut, pas besoin de l'appeler dans ta classe HomeDevice.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct device_t {
    public :
     
        device_t(uint8_t init_id=0) : id(init_id) {}
     
    public:
     
        uint8_t id;
        uint8_t status;
    };
    Tu as aussi la syntaxe à la C
    • HomeDevice() : _device{0} {}
    • HomeDevice() : _device{0, 0} {}
    • HomeDevice() : _device{id: 0} {} - pas sûr que ce soit standard

  3. #3
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par foetus Voir le message
    HomeDevice() : _device{id: 0} {} - pas sûr que ce soit standard
    Non standard mais C++20 ajoute cette syntaxe : _device{.id= 0} avec les designated initializers
    https://en.cppreference.com/w/cpp/la...initialization

    Sinon le plus clair je trouve c'est d'initializer les membres directement à leur définition, depuis C++11 je crois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct device_t
    {
        uint8_t id{0};
        uint8_t status{0};
    };
    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.

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    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 766
    Par défaut
    Après recherche , effectivement les "designated initializers" existe depuis le C99 et la syntaxe _device{id: 0} est obsolète au profit de _device{.id = 0}.

    Designated Initializers, gcc documentation en anglais
    "In ISO C99 you can give the elements in any order, specifying the array indices or structure field names they apply to"

  5. #5
    Membre averti
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 49
    Par défaut
    Merci pour vos réponses et les liens pour les explications.
    Effectivement, il y a quelques solutions, mais parmi celles-ci, y en a t elles qui sont plus dans les règles de l'art ou standards?

    On va dire que je 'bricole' en C++, essentiellement du code pour Arduino et consorts, mais j'essaie de faire du code propre et de me documenter un maximum.

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    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 766
    Par défaut
    Citation Envoyé par Ikes72000 Voir le message
    Effectivement, il y a quelques solutions, mais parmi celles-ci, y en a t elles qui sont plus dans les règles de l'art ou standards?
    je dirais le constructeur de struct ... voire à la limite remplacer les structures par des classes.

    Sinon utilise 1 structure si :
    • tu n'as aucune méthode, qu' 1 constructeur (c'est 1 POD, "Pain Old Data")
    • tu dois faire le lien avec du code C.

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

Discussions similaires

  1. [MySQL] insertion d'un variable de type chaine dans une base
    Par naim2009 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/03/2009, 15h20
  2. variable de type string dans une requete sql
    Par hammag dans le forum JDBC
    Réponses: 9
    Dernier message: 15/06/2008, 01h32
  3. variable de type single dans FormulaR1C1
    Par bbouling dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/04/2008, 15h25
  4. Réponses: 5
    Dernier message: 22/01/2008, 09h54
  5. [Tableaux] Variable de type array dans un formulaire
    Par ThAOTh dans le forum Langage
    Réponses: 3
    Dernier message: 14/03/2006, 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