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
    "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

    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
    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 confirmé
    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
    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
    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
    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
    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 averti
    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 confirmé
    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 averti
    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
    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 averti
    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 confirmé
    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.

###raw>template_hook.ano_emploi###