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 :

Problème d'accès à un pointeur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Par défaut Problème d'accès à un pointeur
    Bonsoir,

    J'ai un problème depuis hier que je n'arrive pas à résoudre, j'ai essayé plusieurs solutions sans succès
    Est-il possible d'accéder à un pointeur d'une classe englobante depuis une structure imbriquée ? Voici une partie de mon code pour mieux comprendre :

    La classe Mesh :
    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
    class QOpenGLFunctions;
     
    class Mesh
    {
     
    public:
        Mesh();
        ~Mesh();
     
    private:
        QOpenGLFunctions* m_funcs;
     
        struct MeshEntry
        {
            MeshEntry();
            ~MeshEntry();
     
            void Init(const vector<Vertex>& Vertices, const vector<unsigned int>& Indices);
        };
     
    };
    La fonction Init de la structure MeshEntry où je fais appel au pointeur voulu (m_funcs) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Mesh::MeshEntry::Init(const vector<Vertex>& Vertices, const vector<unsigned int>& Indices)
    {
        m_funcs->glGenBuffers(...); // Erreur C2327 / C2065 / C2227
    }
    Le constructeur de la classe Mesh (il n'y a pas de problème à ce niveau là, j'utilise ce bout de code dans d'autres classes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Mesh::Mesh() : m_funcs(0)
    {
        QOpenGLContext* context = QOpenGLContext::currentContext();
     
        Q_ASSERT(context);
     
        m_funcs = context->functions();
        m_funcs->initializeOpenGLFunctions();
    }
    Je peux utiliser le pointeur m_funcs dans les méthodes de la classe Mesh mais dès que je l'utilise à l'intérieur d'une fonction de la structure MeshEntry, le compilateur m'envoie 3 erreurs :

    C2327 : "Mesh::m_funcs" n'est pas un nom de type, un membre static, ni un énumérateur
    C2065 : "m_funcs" : identificateur non déclaré
    C2227 : la partie gauche de "->glGenBuffers" doit pointer vers un type class/struct/union/générique

    Existe-t-il une solution pour accéder à ce pointeur depuis cette structure ?

    Merci d'avance

  2. #2
    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
    Bonsoir,

    ton compilateur a bien raison, m_func n'a strictement rien à voir avec MEshEntry.
    Le fait que tu ais déclaré MeshEntry dans Mesh est totalement anecdotique et n'y change rien.
    Si tu veux utiliser m_func, qui est membre de Mesh, il te faut une instance de Mesh.
    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
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Par défaut
    Merci pour ta réponse.

    Je viens d'essayer ta solution, il n'y a plus d'erreur au niveau du pointeur mais une autre est apparue :

    C2582 : 'operator =' fonction non disponible dans 'Mesh::MeshEntry'

    Je comprend l'erreur mais je n'arrive pas à implémenter une solution qui marche... voici ce que j'ai modifié :

    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
    class Mesh
    {
     
    public:
        Mesh();
        ~Mesh();
     
    private:
        QOpenGLFunctions* m_funcs;
     
        struct MeshEntry
        {
            MeshEntry(Mesh& mesh);
            ~MeshEntry();
     
            void Init(const vector<Vertex>& Vertices, const vector<unsigned int>& Indices);
            void operator=(const MeshEntry& me);
     
            Mesh& m_mesh;
        };
     
    };
    Le constructeur de MeshEntry :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Mesh::MeshEntry::MeshEntry(Mesh& mesh) : m_mesh(mesh)
    {
     
    }
    La fonction Init :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Mesh::MeshEntry::Init(const vector<Vertex>& Vertices, const vector<unsigned int>& Indices)
    {
        m_mesh.m_funcs->glGenBuffers(...);
    }
    Et voila ce que je n'arrive pas à implémenter, je ne sais pas même si c'est bien ce que demande le compilateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Mesh::MeshEntry::operator=(const MeshEntry& me)
    {
        // ...
    }

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Pas tout à fait, le retour doit être une référence sur la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mesh::MeshEntry & operator=(const MeshEntry& me);
    Je te laisse consulter la FAQ Quand dois-je définir l'opérateur d'affectation ? ainsi que ses liens annexes.

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Par défaut
    J'avais déjà regardé cette section de la FAQ, mais je me demande pourquoi je dois utiliser la surcharge de l'opérateur d'affectation pour simplement faire référence à une classe afin d'utiliser un de ses membres, je suis perdu... De plus, la solution apporté par la FAQ n'est pas adaptée à mon problème, si ?

    Edit : Je viens de tomber sur ça : http://stackoverflow.com/questions/6...-c-inner-class

    La première solution, c'est de passer en paramètre une référence de la classe Mesh aux fonctions qui en ont besoin mais dans mon cas elle ne peut pas fonctionner car j'ai besoin d'utiliser ce pointeur dans le destructeur de MeshEntry
    Et ils ne mentionnent pas l'utilisation de l'opérateur d'affection pour l'autre solution (celle que je viens d'essayer).

  6. #6
    Invité
    Invité(e)
    Par défaut
    Parce qu'une référence ne tolère pas une valeur "par défaut", il faut obligatoirement lui en fournir une de valide, ce qu'est incapable de faire l'opérateur = fourni par défaut. Il faut donc le définir toi-même en prenant soin d'initialiser ta référence correctement (il en est d'ailleurs de même pour le constructeur par copie).
    Ou si tu n'as pas envie de t'embêter à le redéfinir, tu peux utiliser un std::reference_wraper.

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

Discussions similaires

  1. Problème d'accès à un tableau de pointeur
    Par gronaze dans le forum C++
    Réponses: 2
    Dernier message: 24/11/2011, 10h02
  2. [ADO] [MSACCESS] Problème d'accès à une table nommée OF
    Par FredRaid dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/02/2005, 17h22
  3. Problème d'accès à une DB
    Par Mvu dans le forum ASP
    Réponses: 4
    Dernier message: 04/01/2005, 11h36
  4. [TOMCAT] JSP problème d'accès aux méthodes d'une classes
    Par gunnm dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 22/05/2004, 14h02
  5. problème d'acces concurentiel à un fichier
    Par Theoden dans le forum MFC
    Réponses: 2
    Dernier message: 04/03/2004, 09h49

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