bonjour oui tout est dans le titre je souhaiterias savoir comment puis je passer this en parametre d'une fonciton. merci:ccool:
Version imprimable
bonjour oui tout est dans le titre je souhaiterias savoir comment puis je passer this en parametre d'une fonciton. merci:ccool:
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 :D)
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:
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);} };
merci pour ta reponse j'ai essayer de l'appliquer pour un constructeur
ex :
le compilateur bloque sur :Code:
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:
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 calculateurCode:
1
2
3
4
5
6
7
8
9 Moteur::Moteur() { } void Moteur::lancerCalculateur(){ Calculateur* calcul = new Calculateur(this); }
oups désolé:mouarf:Code:
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:
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:
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:
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" :P
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 :question:
Je parierais sur une erreur à la déclaration du constructeur.
voila Moteur.h
Moteur.cppCode:
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.hCode:
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.cppCode:
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 :PCode:
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
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 :ccool:
Je vous remercie et vous souhaite une bonne journée @ ++