Journal Je ne comprends pas G++

Posté par (page perso) .
Tags : aucun
0
24
fév.
2004
J'ai une classe Camera, définie dans un fichier camera.h (et implémentée dans le camera.cpp qui va avec).
Maintenant, dans la déclaration d'une fonction d'une autre classe (genre Map::Render , je lui dis de prendre une pointeur sur un objet de type Camera en paramètre : Map::Render(Camera* myCam)).
J'ai bien évidemment fait un #include camera.h avec de définir ce pointeur sur une instance de Camera...
Seulement, je me prends des erreurs de syntaxe, comme si je n'avais jamais défini Camera.
J'ai remarqué qu'il suffisait de rajouter "class Camera" avant d'initialiser ce pointeur pour que ça passe...
Est-ce normal ?
Merci d'éclairer ma lanterne :-D
  • # Re: Je ne comprends pas G++

    Posté par (page perso) . Évalué à 2.

    On ne pourrait pas voir les fichiers ? On ne peut pas non plus voir les erreurs de G++ ?

    La solution se trouve ici:
    http://linux.ensimag.fr/poserquestion.html(...)
  • # Re: Je ne comprends pas G++

    Posté par . Évalué à -2.

    C'est normal, c'est a cause de C++ qui gère les environement comme une m***.
    Pour lui un environement est une "zone syntaxique" alors faut lui dire gentiment dans la zone syntaxique "qui va biens" qu'il exite une class "Camera"

    ps: j'ai un peu exagéré mais bon , C++ c'est vraiment fait avec les pieds ....
    • [^] # Re: Je ne comprends pas G++

      Posté par . Évalué à 4.

      « ps: j'ai un peu exagéré mais bon , C++ c'est vraiment fait avec les pieds .... »

      Non. Mais tu n'as dû t'en servir qu'avec tes pieds, ça doit être ça.
    • [^] # Re: Je ne comprends pas G++

      Posté par . Évalué à -1.

      Dans mon empressement de dire C++ sapu j'ai oublié un peu de t'aider ...

      En fait tu doit avoir tes ".h" qui forment un cycle et donc a cause des "#ifndef MON_H", un des fichier n'a plus la déclaration de la classe sensée etre incluse ...
      Du coup pour lui dire qu'elle existe biens il faut, de maniérre redondante ecrire "class Camera"

      Voila, pas sur d'avoir était trés clair mais bon, tu as interret a commencer a te faire mal au neuronnes si tu continu avec le C++ ... (au passage, esseye Eiffel, et la vie te sourira de nouveau!)
      • [^] # Re: Je ne comprends pas G++

        Posté par . Évalué à 1.

        En fait tu doit avoir tes ".h" qui forment un cycle et donc a cause des "#ifndef MON_H", un des fichier n'a plus la déclaration de la classe sensée etre incluse ...

        Peu probable, si un fichier inclus, même en cas de cycle ou de deadlock, est ignoré à cause d'un « #ifndef MON_H », c'est que le symbole en question a déjà été défini, donc par ce fichier, et donc que la déclaration de classe qu'il contient se trouve elle aussi déjà en mémoire. Par conséquent, cela ne devrait pas perturber sa compilation.
    • [^] # Re: Je ne comprends pas G++

      Posté par (page perso) . Évalué à 0.

      C++ c'est vraiment fait avec les pieds ....

      Ah la la, ces frustrés du Java...
  • # Re: Je ne comprends pas G++

    Posté par . Évalué à 0.

    Ton fichier Render.h inclue Camera.h et ton fichier Camera.h inclue Render.h ? Ou un cycle du genre.
    Il suffit de couper le cycle avec une déclaration (pas une définition) d'une classe concernée. Par exemple « class Camera ; » un peu avant de l'utiliser (pourvu que tu n'utilises que des pointeurs dessus, ou qu'il n'y ait pas besoin de connaitre sa définition).
  • # Re: Je ne comprends pas G++

    Posté par . Évalué à 1.

    Le truc bête, tu utilises quel type d'include ?

    #include "camera.h"
    #include <camera.h>
    #include camera.h

    Le premier cherchera dans le répertoire courant, et il faudra préciser le chemin si ce n'est pas le bon. Le second ira voir dans les répertoires standards et ceux précisés par l'option -I . Je n'ai jamais vu le troisième, je ne sais pas s'il marche. Ensuite, le C++ peut se passer du « .h » dans les déclarations, il me semble, mais tes fichiers doivent sans doute être nommés en conséquence.

    Ensuite dans Map::Render, « Map » c'est quoi ? Un namespace, une classe qui contient une méthode Render ? ou une sous-classe Render ?

    Si tu as mis ta « caméra » dans une zone de nommage ou une classe mère, n'oublie pas de la qualifier avec le nom de cet environnement. Ou alors utilise using namespace blahblah; en haut de ton source, et dans le bon ordre s'il y en a plusieurs.

    Enfin, spécifier « class camera » revient à déclarer la classe. C'est exactement la même chose que dans ton .h, sauf qu'il manque l'essentiel: Le bloc qui suit et qui contient les données membres et méthodes. Donc le compilateur accepte de continuer en espérant que le code que tu génères sera linké avec ce qu'il manque, mais ne sait absolument pas de quoi il s'agit. Donc, non ce n'est pas une bonne idée :-)

    Voila. Tiens-nous au courant. A++
    • [^] # Re: Je ne comprends pas G++

      Posté par (page perso) . Évalué à 1.

      J'utilise #include <chemin_vers_camera/camera.h> .

      Ensuite, Map est une classe qui contient une méthode Render.

      Il est fort possible que les #include fassent une boucle (que map.h soit inclus par camera.h et camera.h inclus par map.h :-P). Seulement, je ne peux pas supprimer cette boucle.
      Donc la solution, c'est d'utiliser des espaces de nommage ? ( et d'enlever les "class Camera" tout pas beau )
      • [^] # Re: Je ne comprends pas G++

        Posté par . Évalué à 1.

        Nan, nan. Essaie déjà de remplacer

        #include <chemin_vers_camera/camera.h>

        par

        #include "chemin_vers_camera/camera.h"

        Sinon, ton « chemin_vers_camera » sera lui-même relatif aux différents répertoires standard de dépot des headers C++, et donc pas à ceux de ton projet.

        Ensuite, que les headers fassent une boucle, c'est pas un problème en soi, si tant est qu'il soient protégés par des #ifndef et que les inclusions se fassent (évidement) avant les déclarations de classe. C'est plus génant si tes deux classes se réfèrent l'une à l'autre, genre class Map qui contient un pointeur vers Camera, et Camera qui contient un pointeur vers Map. Dans ce cas, évidement, il faut les déclarer chacune dans leur coin, en prototypant dans chacun des fichiers headers la classe d'en face.
        Donc, comme tu le fais:

        Map.h:
        class Camera;
        class Map
        {
        Blah blah blah
        };

        Camera.h:
        class Map;
        class Camera
        {
        Blah blah blah
        };

        Deux réserves cependant:

        1) Il n'est pas du tout dit que ce soit effectivement la cause du problème présent. Essaie déjà d'utiliser des guillemets dans tes #include.

        2) J'ai déjà été confronté à ce problème mais si tu as un deadlock entre deux classes, cela peut révéler une erreur de conception antérieure. Typiquement, dans le cas précis, une méthode qui renverrait une classe homologue serait condamnée à créer cet objet dynamiquement, objet qui en aucun cas ne pourrait être un membre de la classe qui contient la méthode en question, par exemple.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.