bonjour oui tout est dans le titre je souhaiterias savoir comment puis je passer this en parametre d'une fonciton. merci![]()
bonjour oui tout est dans le titre je souhaiterias savoir comment puis je passer this en parametre d'une fonciton. merci![]()
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
merci pour ta reponse j'ai essayer de l'appliquer pour un constructeur
ex :
le compilateur bloque sur :
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); } }
mais ca ne fonctionne pas j'ai peut etre oublié quelque chose?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Classe1 *c1 = new Classe1(this);
Il faut considérer que this n'est pas disponible dans le contructeur, vu que tu es en train de créer l'objet.
arf oui mon exemple n'est pas bon je vais posté le vrai code ^^
la classe moteur
la classe calculateur
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); }
oups désolé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Calculateur::Calculateur(Moteur *mot) { ...... }![]()
this renvoie un pointeur constant.
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)
les erreurs
correspondent à cette ligne:
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)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Calculateur* calcul = new Calculateur(this);
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.
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
Je parierais sur une erreur à la déclaration du constructeur.
voila Moteur.h
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
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
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
18 #include "Moteur.h" Moteur::Moteur() { } Moteur::~Moteur() { } void Moteur::lancerCalculateur(){ Calculateur* calcul = new Calculateur(this); }
Calculateur.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 #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 */
Voilou
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() { }![]()
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.
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).
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.
C'est pas grave ça indique tout de même très bien la source du problème, c'était juste une correction mineure.
Effectivement s'était bien le problème
Je vous remercie et vous souhaite une bonne journée @ ++
Partager