Composition d'objets (la classe utilise la classe)
Je voudrais écrire une classe qui utilise une autre classe et ses fonctions membres. J'ai découvert que c'était de la composition d'objets et j'ai lu quelques exemples sur la façon de le faire, mais soit cela ne fonctionne pas pour moi, soit je ne le comprends tout simplement pas. Voici des parties de mon code.
#include <SPFD5408_Adafruit_GFX.h> // Core graphics library
#include <SPFD5408_Adafruit_TFTLCD.h> // Hardware-specific library
#include <SPFD5408_TouchScreen.h> // Touch library
#include <TriangleButton.h> // TriangleButton library
Je veux utiliser un objet Adafruit_TFTLCD et ses fonctions membres dans ma propre classe TriangleButton. L'objet tft est initialisé avant l'installation.
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); //Class is part of SPFD5408_Adafruit_TFTLCD.h
J'ai construit le TriangleButton.h similaire à ce thread ( Use object of other class within class ) et utilisé une référence à l'objet tft.
/*
TriangleButton.h - Library for for constructing and reading triangle Buttons.
*/
#ifndef TriangleButton_h
#define TriangleButton_h
#include "Arduino.h"
#include <SPFD5408_Adafruit_TFTLCD.h>
class TriangleButton
{
public:
TriangleButton(Adafruit_TFTLCD &tft, int16_t coordX, int16_t coordY, int16_t orientation, uint16_t size, uint16_t color) : _tft(tft){}
boolean IsTriggered();
void dash();
private:
Adafruit_TFTLCD &_tft;
int16_t _coordX;
int16_t _coordY;
int16_t _orientation;
int16_t _size;
int16_t _color;
int16_t _ru;
int16_t _hc;
};
#endif
Dans le ccp. je mets un constructeur correspondant.
TriangleButton::TriangleButton(Adafruit_TFTLCD &tft, int16_t coordX, int16_t coordY, int16_t orientation, uint16_t size, uint16_t color)
:
_tft(tft)
Maintenant, je reçois le message d'erreur suivant:
C: \ Users \ Erik \ Documents \ Arduino \ bibliothèques \ AquariumController_Library \ TriangleButton.cpp: 19: 1: erreur: redéfinition de 'TriangleButton :: TriangleButton (Adafruit_TFTLCD &, int16_t, int16_t, int16_t, uint16_t, uint16_t' TriangleButton :: TriangleButton :: (Adafruit_TFTLCD & tft, int16_t coordX, int16_t coordY, int16_t orientation, uint16_t size, uint16_t color) ^ ~~~~~~~~~~~~~ Dans le fichier inclus à partir de C: \ Users \ Erik \ Documents \ Arduino \ bibliothèques \ AquariumController_Library \ TriangleButton.cpp: 7: 0: C: \ Users \ Erik \ Documents \ Arduino \ bibliothèques \ AquariumController_Library \ TriangleButton.h: 14: 5: remarque: 'TriangleButton :: TriangleButton (Adafruit_TFTLCD &, int16_int, int16_t16_t, int16_t , uint16_t) 'précédemment défini ici TriangleButton (Adafruit_TFTLCD & tft, int16_t coordX, int16_t coordY, int16_t orientation, uint16_t size, uint16_t color): _tft (tft) {} ^ ~~~~~~~~~~~~ exit status 1
Je ne comprends pas pourquoi il y a une redéfinition. Quelqu'un peut-il me l'expliquer?
Réponses
erreur: la classe 'TriangleButton' n'a aucun champ nommé '_tft'
Cela devrait être explicite. Lorsque vous écrivez dans le constructeur
_tft(tft)
Cela signifie «initialiser la propriété _tftde cet objet avec le paramètre tft.
Ce que vous entendez par «composition d'objets» n'est pas très clair. Dans le sens habituel, cela signifie que l'objet A est ou a un objet B. Dans votre cas, il semble que vous souhaitiez que vous TriangleButtonconteniez une référence à un Adafruit_TFTLCD. Ce n'est pas vraiment de la composition, car votre classe n'est ni n'a ni LCD.
Comme solution immédiate, ajoutez simplement un membre de données approprié à la classe:
Adafruit_TFTLCD &_ftf;
En supposant que tenir une référence à l'écran LCD est vraiment ce que vous voulez pour votre classe, cela devrait suffire à résoudre votre problème.
Modifier : pour répondre à la question modifiée.
«Redéfinition» signifie que vous définissez à nouveau quelque chose qui a déjà été défini auparavant. Dans ce cas, le constructeur est défini en ligne dans le fichier d'en-tête:
TriangleButton(Adafruit_TFTLCD &tft,
int16_t coordX, int16_t coordY,
int16_t orientation, uint16_t size, uint16_t color)
: _tft(tft){}
(oui, c'est une définition complète avec un corps vide).
Et puis vous essayez de le définir à nouveau dans le fichier cpp. C'est une erreur, chaque méthode ne doit être définie qu'une seule fois. À votre choix, il peut être intégré dans l'en-tête ou dans le .cpp, mais pas les deux.