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 :

fonction avec this en paramètre


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 270
    Par défaut fonction avec this en paramètre
    bonjour oui tout est dans le titre je souhaiterias savoir comment puis je passer this en parametre d'une fonciton. merci

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 643
    Par défaut
    Salut,

    Dans une fonction membre de la classe elle-même, this est passé de manière implicite (tu n'a rien à faire, le compilateur s'en charge pour toi )

    S'il s'agit de passer this à une fonction non membre de la classe, tu dois, tout simplement, le passer sous la forme d'un pointeur vers la classe correspondante:
    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
    /* just to make the compiler knows that MyClass exists */
    class MyClass;
    void myFunction(MyClass * mc)
    {
        mc->foo();
    }
    class MyClass
    {
        public:
            void foo()
            {
                /* this is well known by this function but can (in most cases) be
                 * omitted : */
                this->bar() ;
                /* should have exactly the same behaviour than */
                bar();
            }
        private:
            void bar(){/* ... */}
            void doSomething(){ myFunction(this);}
    };
    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

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 270
    Par défaut
    merci pour ta reponse j'ai essayer de l'appliquer pour un constructeur
    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Classe1{
    Classe1::Classe1(Classe2 *c2){
     
    }
     
    }
    class Classe2{
    Classe2::Classe2(){
      Classe1 *c1 = new Classe1(this);
      }
    }
    le compilateur bloque sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Classe1 *c1 = new Classe1(this);
    mais ca ne fonctionne pas j'ai peut etre oublié quelque chose?

  4. #4
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Il faut considérer que this n'est pas disponible dans le contructeur, vu que tu es en train de créer l'objet.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 270
    Par défaut
    arf oui mon exemple n'est pas bon je vais posté le vrai code ^^

    la classe moteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Moteur::Moteur() {
     
    }
    void Moteur::lancerCalculateur(){
     
            Calculateur* calcul = new Calculateur(this);
     
    }
    la classe calculateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Calculateur::Calculateur(Moteur *mot) {
     ......
     
    }
    oups désolé

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    this renvoie un pointeur constant.

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 270
    Par défaut
    Ok j'ai bien rajouter le constant appresent j'ai ceci comme erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Moteur.cpp:25: error: invalid conversion from ‘Moteur* const’ to ‘int’
    Moteur.cpp:25: error:   initializing argument 1 of ‘Calculateur::Calculateur(int)

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 270
    Par défaut
    les erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Moteur.cpp:25: error: invalid conversion from ‘Moteur* const’ to ‘int’
    Moteur.cpp:25: error:   initializing argument 1 of ‘Calculateur::Calculateur(int)
    correspondent à cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Calculateur* calcul = new Calculateur(this);

  9. #9
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Visiblement le compilateur ne trouve pas de constructeur pour la classe Calculateur qui prenne un Moteur * const (ou const Moteur *, dans ce cas c'est pareil) en paramètre.

  10. #10
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 270
    Par défaut
    bon ben ca ne marche pas je vais finalement passer par un singleton merci quand meme je ne met pas resolu

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 643
    Par défaut
    Citation Envoyé par bakman Voir le message
    bon ben ca ne marche pas je vais finalement passer par un singleton merci quand meme je ne met pas resolu
    Arfff... quelle horreur...

    Le singleton est, typiquement, ce que l'on appelle un "anti patern"

    je te reporte à pas mal de discussion sur le sujet, et au blog d'emmanuel pour comprendre ma réaction

    Pourrais tu, s'il te plait, nous donner la déclaration complète de ta classe calculateur ainsi que celle de ta classe moteur
    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

  12. #12
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Je parierais sur une erreur à la déclaration du constructeur.

  13. #13
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 270
    Par défaut
    voila Moteur.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
    18
    19
    20
     
    #ifndef MOTEUR_H
    #define	MOTEUR_H
     
    #include <pthread.h>
    #include <stdlib.h>
    #include<string.h>
     
    #include "Calculateur.h"
    #include "Log.h"
    #include "enums.h"
     
    class Moteur  {
    public:
        Moteur();
        virtual ~Moteur();
        void lancerCalculateur();
     
    };
    #endif
    Moteur.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
     
     
    #include "Moteur.h"
     
    Moteur::Moteur() {
     
     
    }
     
    Moteur::~Moteur() {
    }
     
     
    void Moteur::lancerCalculateur(){
     
            Calculateur* calcul = new Calculateur(this);
     
    }
    Calculateur.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 CALCULATEUR_H
    #define	CALCULATEUR_H
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string>
    #include <iostream>
     
    class Calculateur {
    public:
        Calculateur (Moteur const *mot);
        virtual ~Calculateur();
     
    };
     
    #endif	/* CALCULATEUR_H */
    Calculateur.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "Calculateur.h"
    #include "Moteur.h"
     
    Calculateur::Calculateur(Moteur const *mot) {
     
    }
     
    Calculateur::~Calculateur() {
     
    }
    Voilou

  14. #14
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Les dépendances de fichier sont étranges...

    Dans Calculateur.h, la classe Moteur n'est pas défini (forward declaration ou include à ajouter, ça devrait corriger ton problème)

    Dans Moteur.h, il y a l'include de Calculette.h, il serait mieux dans Moteur.cpp parce que utilisée (la classe) qu'ici.

  15. #15
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    C'est un problème d'includes.
    Il faut que tu enlèves le #include "Calculateur.h" du fichier 'Moteur.h', tu fais cet include uniquement dans Moteur.cpp .
    Dans ton fichier Calculateur.h il faudra donc que tu prédéclares la classe Moteur (class Moteur; ) avant ta classe Calculateur.
    De plus, si le fichier Moteur.h que tu as posté est bien complet, alors enlève tous les includes que tu y as faits, et mets les dans Moteur.cpp, de même pour les includes dans Calculateur.h .

    De manière générale, pour diminuer les temps de compilation, il vaut mieux éviter les include dans les fichiers .h
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  16. #16
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Citation Envoyé par Hylvenir Voir le message
    Dans Calculateur.h, la classe Moteur n'est pas défini.
    Défini encore c'est pas grave, mais pas déclaré là oui. Je pense que tu as un compilo qui utilise le type int par défaut quand il ne connait pas un type (d'où ton message d'erreur). Je sais que sous visual cette "fonctionnalité" est désactivée et du coup ça met comme message d'erreur un truc du genre "le type Moteur n'est pas déclaré, type int par défault non supporté". Donc tu as juste à déclarer ta classe Moteur dans Calculateur et ça devrait marcher.

  17. #17
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Citation Envoyé par oxyde356 Voir le message
    Défini encore c'est pas grave, mais pas déclaré là oui. Je pense que tu as un compilo qui utilise le type int par défaut quand il ne connait pas un type (d'où ton message d'erreur). Je sais que sous visual cette "fonctionnalité" est désactivée et du coup ça met comme message d'erreur un truc du genre "le type Moteur n'est pas déclaré, type int par défault non supporté". Donc tu as juste à déclarer ta classe Moteur dans Calculateur et ça devrait marcher.
    oui, lapsus. Ca m'arrive souvent.

  18. #18
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    C'est pas grave ça indique tout de même très bien la source du problème, c'était juste une correction mineure.

  19. #19
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 270
    Par défaut
    Effectivement s'était bien le problème
    Je vous remercie et vous souhaite une bonne journée @ ++

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

Discussions similaires

  1. Fonction avec fichier en paramètre
    Par amazigh42 dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 14/02/2013, 10h19
  2. Fonction avec type de paramètre variable
    Par zentaf dans le forum C
    Réponses: 7
    Dernier message: 15/01/2013, 17h32
  3. Macro-fonction avec nombre de paramètres non fixé
    Par miasseu dans le forum Macro
    Réponses: 2
    Dernier message: 31/08/2012, 16h36
  4. fonction avec setTimeOut et paramètres
    Par jeff74 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/10/2008, 19h26
  5. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00

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