Le monde des objets (4)
. Par : Thierry
Vous répondez à :
Bonjour
Le mieux est de poser la question sur le forum en mettant en fichier attaché le source complet, tel que vous l’imaginez. Difficile de savoir ce que vous voulez réellement faire avec trois lignes...
4 Messages
-
Le monde des objets (4) 27 avril 2018 16:17, par Lk
Bonjours, merci pour votre article.
J’aimerais pouvoir créer une classe dont le constructeur prennent en paramètre un objet pour pouvoir récupérer les variables qui lui sont définies. J’ai essayé avec les pointeurs, sans réussite.//Le fichier .cpp
#include "CaptPos.h"
#include "Moteur.h"CaptPos : : CaptPos (int a0, int captA, Moteur *motA) //avec et sans *
Et j’obtiens
“error : no matching function for call to ’Moteur::Moteur()’”Merci de m’aider à résoudre mon problème.
-
Le monde des objets (4) 27 avril 2018 16:33, par Thierry
Bonjour
Le mieux est de poser la question sur le forum en mettant en fichier attaché le source complet, tel que vous l’imaginez. Difficile de savoir ce que vous voulez réellement faire avec trois lignes...
-
Ce n’est pas vraiment un projet de modélisme ferroviaire, et j’ai pu voir que ce n’était pas vraiment recommander de s’inscrire sinon.
Voici Moteur.h
class Moteur { public: Moteur(int E, int M); void reculer(); void avancer(); void arreter(); private: int _E; int _M; };
et j’aimerais pouvoir utiliser dans la classe CaptPos un objet Moteur (pour l’initialisation et le retour a (0 ;0) de mon repère) qu’on lui mettrai en paramètre :
CaptPos.h
class CaptPos { public: CaptPos (int a0, int captA, Moteur motA); void initialiser(); void Pos(); private: int _a0, _captA; Moteur _motA; };
Merci si vous pouvez m’aider.
PS : je vois que les accolades ne s’affichent pas mais elles y sont.
-
-
Le monde des objets (4) 1er mai 2018 14:07, par Thierry
Je ne devrais pas répondre puisqu’il ne s’agit pas de petits trains, mais je vais le faire quand même parce que la réponse peut aider d’autres programmeurs débutants. Accessoirement, il faudra que j’ajoute un petit chapitre sur le sujet dans mon article sur les pointeurs (http://www.locoduino.org/spip.php?a...)...
Une classe comme Moteur n’est pas un type simple comme un entier ou un byte. Copier le contenu d’un exemplaire d’une classe dans un autre n’est pas trivial. La première méthode consiste à utiliser un constructeur particulier, dit constructeur par copie, qui reçoit l’original en argument et copie le contenu dans ’this’.
Moteur(const Moteur &original) { this->_E = original._E; this->_M = original._M; }
Le ’const’ dit que personne ne modifiera le contenu de ’original’ dans le corps du constructeur, et le ’&’ permet à la fois de passer un pointeur plutôt qu’une classe entière (gain de mémoire sur la pile), et de manipuler l’objet comme s’il n’était pas un pointeur ! Notez le ’original.’ au lieu de ’original->’ dans le code.
Mais l’usage d’un constructeur suppose l’utilisation d’une allocation dynamique ’new’, ce qui signifie des pointeurs...
L’autre possibilité est de définir ce que signifie un ’=’ pour cette classe. On le fait ainsi :
class Moteur { public: ... Moteur &operator=(const Moteur &original);
On déclare un ’operator=’ dans la classe Moteur, qui prend en argument un original et qui renvoie un pointeur sur la version modifiée. En réalité, la valeur de retour n’a pas trop d’importance... Dans le cpp correspondant, on va ajouter la fonction :
Moteur &Moteur::operator=(const Moteur &original) { this->_E = original._E; this->_M = original._M; return *this; }
Une fois cela écrit, il faut déclarer correctement le constructeur de CaptPos en utilisant la même syntaxe :
CaptPos (int a0, int captA, const Moteur &motA);
et de coder correctement ce constructeur :
CaptPos::CaptPos(int a0, int captA, const Moteur &motA) { this->_a0 = a0; this->_captA = captA; this->_motA = motA; }
A la faute de frappe près (je n’ai pas compilé pour vérifier ma syntaxe), ça devrait le faire !