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 de pointeur pour le prototype d'une methode


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut problème de pointeur pour le prototype d'une methode
    Bonjour à tous,
    Cela fait longtemps que je n'ai pas codé en C++ (si on considère que j'ai "commencé" et pour m'y coller je me lance avec la librairie SFML 2.1).
    Pour info je suis sur Ubuntu 13.10 (oui il faut que j'update mais là tout de suite c'est pas possible) et j'utilise g++-4.8

    Mon problème et le suivant :
    J'ai d'abord, pour tester, tout mit dans le "main.cpp" pour tester mon code et TOUT fonctionnait très bien.
    Puis pour faire plus propre j'ai séparé ma classe du main en créant un .cpp et un .h (Normal me direz vous)

    à partir de là j'obtiens l'erreur suivante : "triangle.h:8:24: error: expected ‘)’ before ‘*’ token", voici le prototype Triangle::Triangle(s_Triangle* t);

    Pas moyen de comprendre pourquoi le compilateur me dit ça.

    voici mon code pour plus de détails, ainsi que les erreurs de compilations :

    main.cpp:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    #include <stdio.h>      /* printf, scanf, NULL */
    #include <stdlib.h>     /* malloc, free, rand */
    #include <SFML/Graphics.hpp>
    #include "./graphic/geometric/classe/triangle.h"
     
    struct s_Triangle
    {
        // Toutes les meusures sont en px 
        uint width;
        uint height;
        uint posX;
        uint posY;
        sf::Color color[3];
        /*int rotation;*/
    };
     
    int main()
    {
        // Creation d'une fenêtre
        sf::RenderWindow window(sf::VideoMode(800, 600), "SFML works!");
     
        // VSync
        window.setVerticalSyncEnabled(true);
        // Déplacement de la fenêtre
        window.setPosition(sf::Vector2i(10,50));
     
        // définition d'un triangle
        s_Triangle *s_triangle = new s_Triangle;
     
        s_triangle->width  = 100;
        s_triangle->height = 50;
        s_triangle->posX   = 10;
        s_triangle->posY   = 25;
        s_triangle->color[0] = sf::Color::Red;
        s_triangle->color[1] = sf::Color::Blue;
        s_triangle->color[2] = sf::Color::Green;
     
        Triangle* triangle = new Triangle(s_triangle);
        delete[] s_triangle;
     
        while (window.isOpen())
        {
            // Class d'Events
            sf::Event event;
     
            //Events relatifs à la fenêtre
            while (window.pollEvent(event))
            {
                if (event.type == sf::Event::Closed)
                    window.close();
            }
     
            // SANS C'EST DEUX FUNCTIONS LA FENÊTRE RÉAGIT TRÈS MAL
            //nettoyage du contenu de la fenêtre
            window.clear();
            window.draw(triangle->getTriangle());
            //affichage du contenu
            window.display();
     
        }
     
        return 0;
    }

    triangle.h:
    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
     
    #ifndef __TRIANGLE_H__
    #define __TRIANGLE_H__
     
    class Triangle
    {
    public:
        Triangle(s_Triangle* t);
        ~Triangle();
        sf::VertexArray getTriangle();
     
    private:
        sf::VertexArray triangle;
     
    };
     
    #endif
    triangle.cpp:
    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
    29
    30
    31
     
    #include <stdio.h>      /* printf, scanf, NULL */
    #include <stdlib.h>  
    #include "./triangle.h"
     
    Triangle::Triangle(s_Triangle* t) {
     
        sf::VertexArray triangle2(sf::Triangles, 3);
        triangle = triangle2;
     
        triangle[0].position = sf::Vector2f(t->posY + t->height,
                                   t->posX
                                   );
     
        triangle[1].position = sf::Vector2f(t->posY,
                                   t->posX
                                   );
     
        triangle[2].position = sf::Vector2f(t->posY,
                                   t->posX + t->width
                                   );
     
        for (int i = 0; i < 3; ++i)
        {
            triangle[i].color = t->color[i];
        }
    }
     
    sf::VertexArray Triangle::getTriangle(){
        return triangle;
    }
    et pour finir les erreurs :
    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
     
    In file included from ./main.cpp:4:0:
    ././graphic/geometric/classe/triangle.h:8:24: error: expected ‘)’ before ‘*’ token
         Triangle(s_Triangle* t);
                            ^
    ./main.cpp: In function ‘int main()’:
    ./main.cpp:38:49: error: no matching function for call to ‘Triangle::Triangle(s_Triangle*&)’
         Triangle* triangle = new Triangle(s_triangle);
                                                     ^
    ./main.cpp:38:49: note: candidates are:
    In file included from ./main.cpp:4:0:
    ././graphic/geometric/classe/triangle.h:5:7: note: Triangle::Triangle()
     class Triangle
           ^
    ././graphic/geometric/classe/triangle.h:5:7: note:   candidate expects 0 arguments, 1 provided
    ././graphic/geometric/classe/triangle.h:5:7: note: Triangle::Triangle(const Triangle&)
    ././graphic/geometric/classe/triangle.h:5:7: note:   no known conversion for argument 1 from ‘s_Triangle*’ to ‘const Triangle&’
    In file included from ./graphic/geometric/classe/triangle.cpp:3:0:
    ./graphic/geometric/classe/./triangle.h:8:24: error: expected ‘)’ before ‘*’ token
         Triangle(s_Triangle* t);
                            ^
    Enfin voilà, si quelqu'un peut m'aider avec ça je lui en serait très reconnaissant, parce que la je sèche complètement.
    Bonne Journée à tous.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    bonjour,
    triangle.h utilise le type s_Triangle déclaré dans main.cpp (?), donc inconnu au iveau du header.
    Pour que ça fonctionne il faut une forward declaration (qui suffit pour utiliser un pointeur):

    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
    #ifndef __TRIANGLE_H__
    #define __TRIANGLE_H__
    
    class s_Triangle;
    class Triangle
    {
    public:
        Triangle(s_Triangle* t);
        ~Triangle();
        sf::VertexArray getTriangle();
     
    private:
        sf::VertexArray triangle;
     
    };
     
    #endif

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci therwald, grâce à toi j'ai pu corriger le problème de la manière suivante :

    s_Triangle étant une structure j' l'ai placée dans un .h et l'ai inclus dans triangle.cpp et main.cpp et tout remarche comme avant !

    encore merci !

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Cool.
    Note: ça fonctionnera comme ça, content d'avoir pu t'aider.
    Pour ta culture, cependant, je te précise qu' il est recommandé de limiter les include au maximum, d'où ma recommandation de la forward declaration.
    pour la raison suivante:
    Ici comme tu n'utilises qu'un pointeur, tu as juste besoin d'informer le compilateur qu'il s'agit d'un nom de type valable. La définition complète de la classe ne sera pas utile tant que tu n'appelleras pas de membres (variables, fonctions). Là ce n'est sans doute pas critique mais en limitant au maximum le nombre d'includes tu permets:
    1) de faciliter la modularité en limitant au maximum les dépendances
    2) d'accélérer la compilation des fichiers
    3) d'éviter des recompilations de fichiers lors des build incrémentaux

    EDIT: je t'ai lu trop vite
    Donc tu as fait ce qui est recommandé, à savoir:
    • forward declaration dans le header
    • include dans le cpp pour pouvoir appeler les fonctions

Discussions similaires

  1. [AC-2007] Problème de critère pour le champ d'une requête de recherche
    Par robin148 dans le forum Access
    Réponses: 1
    Dernier message: 23/05/2014, 12h18
  2. Un pointeur pour le contexte d'une fonction
    Par dca_marshall dans le forum Langage
    Réponses: 16
    Dernier message: 22/10/2013, 14h00
  3. Réponses: 0
    Dernier message: 29/07/2009, 11h13
  4. Réponses: 1
    Dernier message: 02/06/2009, 17h50
  5. Problème d'instruction pour le chargement d'une animation
    Par tarzanjane dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 03/04/2009, 14h41

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