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

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut "une référence de membre non statique doit être relative à un objet spécifique" variable dans une structure
    Bonjour,

    je débute actuellement en c++, j'ai un problème dont je n'arrive pas à résoudre, voici le code :

    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
    struct Matrix
    {
    	int region = 0;
     
    	struct limit
    	{
    		void display()
    		{
    			std::cout << region << std::endl;
    		}
     
    	}limit;
     
    }matrix[4][20];
     
    int main()
    {
    	matrix[0][1].region = 90;
     
    	std::cout << matrix[0][0].region << std::endl;
    	std::cout << matrix[0][1].region << std::endl;
     
     
    	system("pause");
    	return 0;
    }
    impossible de lire la variable region, ils me disent "une référence de membre non statique doit être relative à un objet spécifique", mais lorsque je la met en static, j'obtient la même valeur avec matrix[0][0].region et matrix[0][1].region :

    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
    struct Matrix
    {
    	static int region;
     
    	struct limit
    	{
    		void display()
    		{
    			std::cout << region << std::endl;
    		}
     
    	}limit;
     
    }matrix[4][20];
     
    int Matrix::region;
     
    int main()
    {
    	matrix[0][1].region = 90;
     
    	std::cout << matrix[0][0].region << std::endl;
    	std::cout << matrix[0][1].region << std::endl;
     
     
    	system("pause");
    	return 0;
    }

  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
    Quel problème essayes-tu de résoudre ?
    Ce code est incorrect. Et illogique.
    region est un membre de Matrix, pas de limit, alors limit y a bien sûr pas accès.
    Et puis les syntaxes sont vraiment étranges. Matrix est une structure, mais tu crées ensuite un tableau bidimensionnel de Matrix. Pour en faire une matrice je suppose ? Tu as donc une matrice de Matrix... c'est concept.

    mais lorsque je la met en static, j'obtient la même valeur avec matrix[0][0].region et matrix[0][1].region
    Euh oui.. c'est le principe du mot-clé static dans une variable de class/struct.
    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
    Candidat au Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je vais refaire un autre exemple, car j'essaie de développer un petit jeu de plateau avec des cases, c'est un peu galère à comprendre avec l'ancien code x), voici un autre code :

    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
    struct A
    {
    	int x;
     
    	struct B
    	{
    		bool test()
    		{
    			return (x == 2);
    		}
    	}b;
    }a[4];
     
    int main()
    {
    	a[0].x = 0;
    	a[1].x = 1;
    	a[2].x = 2;
    	a[3].x = 3;
     
    	if (a[0].b.test())
    		std::cout << "x == 2" << std::endl;
    	else
    		std::cout << "x != 2" << std::endl;
     
    	system("pause");
    	return 0;
    }
    C'est pour savoir si c'était possible que la structure B puisse lire la variable x dans la structure A (si c'est possible), vu que la structure B se situe dans la structure A ? voilà voilà ^^

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Tu essaies des choses bizarres, tu devrais peut-être commencer par bien apprendre la syntaxe de base.
    Et non, un type interne n'aucun accès particulier à sa classe englobante (en Java c'est différent).
    En gros une classe interne c'est fait pour l'encapsulation, ça sert à créer de choses internes qui ne concernent pas les autres. Par exemple si tu définis un type dans un fichier source, les autres fichiers ne sauront même pas qu'il existe, c'est local. Si tu définis un type dans une classe. S'il est private, c'est que seule la classe va s'en servir. S'il est public, c'est que seul ceux qui utilisent la classe englobante auront besoin de l'utiliser dans le cadre d'interactions avec cette classe englobante.
    En plus court, quand on débute on a rarement besoin d'utiliser des classes imbriquées.

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci pour toutes vos réponses rapides, j’avoue que j’essaie des choses assez étranges , je pensais qu’il existait un moyen de lire la variable x dans la structure B, mais tout compte fais c’est impossible. Grâce à vous, je ne vais plus rester bloqué sur ce problème ahaha.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Léo976 Voir le message
    je pensais qu’il existait un moyen de lire la variable x dans la structure B, mais tout compte fais c’est impossible
    Pas tant que cela

    Faire 1 structure/ classe imbriquée permet de faire 1 association forte entre 2 classes (c'est + pour la sémantique et l'organisation du code )

    Mais tu as la notion d'amitié avec le mot clef friend, qui permet à 1 structure/ classe d'accéder aux membres/ fonctions d'1 autre classe, même privé et protégé.
    friend declaration, documentation cppreference.com

  7. #7
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Les classes imbriquées ont déjà accès aux membres privés de la classe englobante, friend est inutile. Mais cela ne change pas qu'une instance de classe imbriquée ne connaît pas l'instance de la classe englobante et ne peut donc pas accéder à ces membres, il faut lui donner explicitement une instance de la classe englobante.

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Oula, vous m’avez perdu
    Je vais jeter un œil sur le mot clef friend, je ne connais pas du tout ce que c’est, puis je vous tiendrais au jus si j’ai trouver une alternative...

  9. #9
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Salut,

    Dans ton code, ligne 7, remplace ta fonction bool test() {} par
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bool test(A& a) {
      return (a.x==2);
    }

    et pour l'appel, ligne 21, ton if par
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    if (a[0].b.test(a[0]))

    Cependant, je ne vois pas dans quel intérêt tu utilises une structure imbriquée et avec une dépendance.
    Certainement une mauvaise solution à un faux problème.

  10. #10
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    Les classes imbriquées ont déjà accès aux membres privés de la classe englobante, friend est inutile. ...
    Non, les classes imbriquées n'ont aucun accès aux membres qui ne sont pas public. Leur seul "privilège" est qu'étant dans le contexte de l'englobante, elle accèdent à des noms raccourci.
    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
    struct Externe {
        enum Jour { Lundi, Mardi, Mercredi, Jeudi, Vendredi };
        struct Interne {
            Jour  x = Lundi;   // OK
            Externe::Jour  y = Externe::Jour::Lundi; // OK aussi
            Jour  lendemain( Jour j ); // OK
        };
    };
    struct Autre {
        Jour  x = Lundi; // n'a pas de sens
        Externe::Jour  y = Externe::Lundi;  // OK
    };
    Externe::Jour  Externe::Interne::lendemain( Jour j ) { // on ne peut écrire plus court
        return   static_cast<Jour>( j + 1 );
    }
    // ou bien
    auto  Externe::Interne::lendemain( Jour j ) -> Jour { // on ne peut écrire plus court
        return   static_cast<Jour>( j + 1 );
    }

  11. #11
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Si si, ce n'était pas possible en c++98/03 (donc friend obligatoire) mais dès c++11 ça a été corrigé.

    edit: ref
    Citation Envoyé par https://en.cppreference.com/w/cpp/language/nested_types
    Declarations in a nested class can use any members of the enclosing class, following the usual usage rules for the non-static members.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    Cependant, je ne vois pas dans quel intérêt tu utilises une structure imbriquée et avec une dépendance.
    Certainement une mauvaise solution à un faux problème.
    Ou alors 1 transfuge du JavaScript et des fermetures ("closure" en anglais) à tour de bras (<- lien wiki en français)

  13. #13
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Bonjour foetus,

    Faire quelque chose de propre est tout-à-fait possible, le constructeur de classe est ton ami. Sauf si tu veux un exemple, la grande question c'est surtout qu'est-ce qui a poussé l'auteur du sujet dans la direction des structures imbriquées ?

  14. #14
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    Si si, ce n'était pas possible en c++98/03 (donc friend obligatoire) mais dès c++11 ça a été corrigé.
    Tout change, une évo que j'avais loupé. Merci kaitlyn pour l'info.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/11/2007, 13h14
  2. Réponses: 4
    Dernier message: 31/07/2007, 21h52
  3. [JSP/javascript] lire une variable dans un infobulle
    Par maniolo dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 20/10/2006, 14h50
  4. Réponses: 3
    Dernier message: 02/10/2006, 21h20
  5. lire une donnée dans une variable de session
    Par pblb62 dans le forum Langage
    Réponses: 8
    Dernier message: 21/03/2006, 14h23

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