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 :

Besoin de modifier l'état d'un objet dans un autre objet.


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 26
    Points
    26
    Par défaut Besoin de modifier l'état d'un objet dans un autre objet.
    Bonjour! J'ai un petit problèmes... J'ai une classe Control et une classe Status.

    La classe Control a été créer pour le recevoir les informations du clavier et de la souris et de modifier certaine valeur quand on pese sur tel ou tel touche.

    La classe Status quand à elle sert de "conteneur" pour plusieurs variables.

    Le problèmes est que je protèges mes variables en faisant en sorte qu'on ne puisse modifier leur valeur qu'en appelant une fonction a cet effet.

    Je voudrais savoir comment faire pour que dans ma classe Control je puisse modifier un l'état de Status (vitesse en particulier). Dois-je envoyer l'objet en paramêtre dans la fonction:

    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
       void Control::keyboard(const SDL_KeyboardEvent & event, SDL_Rect & positionImagePerso) {
     
            switch (event.keysym.sym) {
                case SDLK_UP: // Flèche haut
                    positionImagePerso.y-= 1;
                    break;
                case SDLK_DOWN: // Flèche bas
                    positionImagePerso.y+= 1;
                    break;
                case SDLK_RIGHT: // Flèche droite
                    positionImagePerso.x+= 1;
                    break;
                case SDLK_LEFT: // Flèche gauche
                    positionImagePerso.x-= 1;
                    break;
                case SDLK_v: // Flèche gauche
                    break;
                case SDLK_s: // Flèche gauche
                    break;
            }
        }
    afin de pouvoir appeler la fonction: modifieVitesse?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Par exemple.
    Boost ftw

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    Bon voila ce que j'ai fais:

    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
       void Control::keyboard(const SDL_KeyboardEvent & event, SDL_Rect & positionImagePerso, Status status) {
            double sd =10;
            switch (event.keysym.sym) {
                case SDLK_UP: // Flèche haut
                    positionImagePerso.y-= 1 * status.getVitesse();
                    break;
                case SDLK_DOWN: // Flèche bas
                    positionImagePerso.y+= 1 * status.getVitesse();
                    break;
                case SDLK_RIGHT: // Flèche droite
                    positionImagePerso.x+= 1 * status.getVitesse();
                    break;
                case SDLK_LEFT: // Flèche gauche
                    positionImagePerso.x-= 1 * status.getVitesse();
                    break;
                case SDLK_v:
                    status.modifieVitesse(0.1);
                    break;
                case SDLK_s:
                    break;
            }
        }
    Mon seul problèes est le status.modifieVitesse(0.1);.....
    Je ne peu pas l'utiliser...

    La signature de ma fonction est:

    void Status::modifieVitesse(double & vitesseDifference)

    et le problèmes avec sa c'est qu'on me renvoie une erreur:

    control.cpp:23: error: no matching function for call to `Status::modifieVitesse(double)'
    status.h:13: note: candidates are: virtual void Status::modifieVitesse(double&)

    Et la j'ai aucune idées de comment règler ça.

  4. #4
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Si tu mettais un const double& ça marcherait.
    Par ailleurs j'trouve pas ça pertinent de passer des tous petits types par référence, mais bon.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    Qu'est-ce que tu veux dire par la?

    (Et merci)

  6. #6
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Disons qu'en général pour des paramètres de lecture, on utilise des références quand l'objet est tellement gros que faire une copie pourrait pénaliser les performances.
    Quand tu le fais sur des types de bases comme int, float, ça peut avoir l'effet inverse, mais je chipote...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    Ouai mais le problèmes avec tout sa c'est que je peu pas tout mettre dans un seul fichier car le final de mon prog sera assé gros....

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Ezarion
    Ouai mais le problèmes avec tout sa c'est que je peu pas tout mettre dans un seul fichier car le final de mon prog sera assé gros....
    Ca n'a rien à voir...

    Ce que le monsieur te dit, c'est que, tant qu'à faire, il te suffit de modifier le prototype de virtual void Status::modifieVitesse(double&) en virtual void Status::modifieVitesse(double)

    Les types de base n'utilisent que quelques octets maximum et sont très rapidement copiables en mémoire...

    Par contre, les objets plus importants (en gros, toutes les structures et classes que tu peux vouloir définir toi meme ) ont tout intérêt à ne pas etre copiés en mémoire si ce n'est pas absolument indispensable...

    En effet, il faut bien te rendre compte que, meme si c'est rapide du fait de la vitesse des processeurs actuels, copier l'intégralité des différents membres d'une structure, outre le fait que cela implique une redondance des informations, implique prendre pour chaque type de base le temps... de le recopier dans un autre espace mémoire...

    Ce qui, à terme, signifie un ralentissement, surtout pour les structures importantes/imbriqués (tableau de structures contenant des tableaux de caractères par exemple )

    L'idée générale est donc de passer par valeur les types de base: un entier, un caractère, un réel, un double... et de passer par référence (ou par pointeur s'il échoit) tout ce qui est classes et structures (en ce, y compris les classes S(T)L et similaires )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. [PHP 5.3] Un objet dans un autre objet
    Par nakk01 dans le forum Langage
    Réponses: 2
    Dernier message: 19/10/2009, 14h38
  2. Réponses: 9
    Dernier message: 08/01/2009, 18h08
  3. Réponses: 2
    Dernier message: 28/06/2008, 23h08
  4. Réponses: 5
    Dernier message: 22/04/2008, 10h41
  5. Position d'objet dans un autre objet
    Par Speed41 dans le forum Delphi
    Réponses: 14
    Dernier message: 20/02/2007, 20h51

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