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 :

Déclaration d'une struct dans une fonction?


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Déclaration d'une struct dans une fonction?
    Bonjour, j'aimerais savoir s'il est possible de déclarer une struct à l'intérieur d'une fonction. Le but étant de limiter la porté de cette structure à cette seule fonction.

    Le code suivant semble compiler et fonctionner mais je me demande s'il s'agit de la bonne façon de limiter la portée de cette struct.

    merci


    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
     
    #include "stdafx.h"
    #include <string>
     
     
    void FonctionA(void) {
     
    	struct uneStruct_t {
    		uneStruct_t() {
    			str = "le nombre est:";	
    			num = 5;
    		}
    		std::string str;
    		int num;
    	};
     
     
    	uneStruct_t test; 
    	printf("%s %d", test.str.c_str(), test.num);
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	FonctionA();
    	return 0;
    }

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Il est légal de déclarer une struct dans une fonction. Mais c'est assez peu utilisé. Ne serait-ce que parce qu'une telle struct ne peut pas être un argument template (du moins ne C++98, en C++1x, ce sera possible).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Il est légal de déclarer une struct dans une fonction. Mais c'est assez peu utilisé. Ne serait-ce que parce qu'une telle struct ne peut pas être un argument template (du moins ne C++98, en C++1x, ce sera possible).
    Une struct et une classe étant la même chose, ça permet de faire des choses très sympathiques, comme déclarer une classe héritant d'une classe abstraite dans une fonction et retourner un pointeur sur une nouvelle instance. On se rapproche du coup des classes anonymes de Java (mais elles ne sont pas vraiment anonymes - c'est juste que le linker ne voit jamais passer leur nom, au moins en C++98.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    J'avoue ne pas trop savoir à quoi ces classes anonymes sont utilisées en Java (je connais très peu ce langage). La seule application que j'en ai vu à ce jour était pour simuler des lambdas.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    ok merci pour vos réponses,

    c'est donc possible et fonctionnel, mais est-ce la seule façon de limiter la porté d'une struct à une seule fonction en particulier? Par exemple, dans le code que j'ai soumis, je ne veux pas que la fonction main() ait accès à la structure "uneStruct_t" (je ne veux donc pas la déclarer dans la porté de fichier...).

    Pourrions-nous obtenir le même résultat en utilisant un namespace par exemple?

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Presque tout ce qui permet de définir de nouveaux type, exception faite des énumérations (car le type définis n'est qu'une liste de valeurs numériques constances) et des typedef (parce qu'il ne s'agit que d'un autre nom pour un type existant, et que l'on n'en "définit pas le corps") offre essentiellement trois possibilités transversales:
    • La possibilité de définir l'accessibilité du contenu
    • La possibilité d'imbriquer d'autres types (même si les unions subissent une restriction sur le sujet)
    • La possibilité d'imbriquer des fonctions (exception faite pour les unions qui doivent rester de type POD et ne contenir que des types POD)
    De plus, les fonctions et les espaces de noms peuvent contenir des types imbriqués.

    Il n'y a pas de différence entre une structure et une classe, hormis la visibilité par défaut qui est appliquée à leur contenu.

    En cumulant deux de ces possibilités transversales, tu obtiens un grand nombre de manière susceptibles de restreindre l'accès à certains types:

    Si tu déclares un type (qu'il s'agisse d'une classe, d'une structure, d'une union, d'une énumération ou d'un typedef) dans l'accessibilité privée d'un autre, il ne sera accessible que... depuis les fonctions membre du type dans lequel il est imbriqué.

    Il sera accessibles aux types dérivés du type dans lequel il est imbriqué s'il est imbriqué dans son accessibilité protégée, et à "n'importe quoi" s'il est imbriqué dans son accessibilité publique.

    Si tu imbrique un type dans une fonction, il ne sera accessible en tant que tel qu'à l'intérieur de la portée de cette fonction.

    Les deux bonnes questions à se poser sont donc:
    1. Pourquoi voudrais-je limiter l'accès à tel ou tel type de données
    2. Quel type ou fonction doit connaitre tel ou tel type de données, et quel autre type ou fonction doit l'ignorer
    Les outils qui te permettent le cas échéant d'éviter qu'un type particulier ait connaissance d'un autre sont essentiellement:
    1. L'imbrication de type dans l'accessibilité adéquate
    2. Le respect strict de la loi demeter
    3. la séparation qui est faite entre la déclaration (les fichiers d'en-tête) et l'implémentation dans les différentes unités de compilation
    Si, en plus, tu joues avec les espaces de noms, les possibilités deviennent pour ainsi dire infinies, simplement, tu dois savoir exactement ce que tu souhaites faire, et pourquoi
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    ok merci.

    C'est juste que je n'ai pas vu souvent de struct (ou classe) déclaré à l'intérieur d'une fonction et me demandais si c'était une bonne façon (du point de vue architecture logicielle) de limiter la visibilité de cette struct. Selon vos commentaires cela semble ok.

    merci pour toute les réponses.

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    J'avoue ne pas trop savoir à quoi ces classes anonymes sont utilisées en Java (je connais très peu ce langage). La seule application que j'en ai vu à ce jour était pour simuler des lambdas.
    Les listeners d'events sur les classes GUI (en particulier sur Eclipse RCP) prennent généralement la forme de classes anonymes. Ce qui revient effectivement à simuler des lambdas.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  3. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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