2015-03-23 2 views
1

Я работаю над созданием библиотеки Arduino для управления сенсорным экраном. В моей библиотеке собраны уже существующие библиотеки, написанные для интерфейса с сенсорными контроллерами дисплея &.Почему мой производный конструктор классов не работает?

Вот конструктор, который я работал на:

Display.cpp

Display::Display(int displayCSPin, int displayDCPin, int touchCSPin, 
       int newBacklightPin, int newRotation, int newBrightness) 
    : Adafruit_HX8357(displayCSPin, displayDCPin, -1), 
     Adafruit_STMPE610(touchCSPin) 
{ 
//Initialize display 
} 

Display.h

#ifndef DISPLAY_H_ 
#define DISPLAY_H_ 

#include "arduino.h" 
#include "Adafruit_GFX.h" 
#include "Adafruit_HX8357.h" 
#include "Adafruit_STMPE610.h" 

class Display : public Adafruit_HX8357, Adafruit_STMPE610 { 
public: 
    Display(int displayCSPin, int displayDCPin, int touchCSPin, 
      int newBacklightPin, int newRotation, int newBrightness); 
}; 

Всякий раз, когда я пытаюсь скомпилировать, компилятор игнорирует переменные в конструкторах базового класса и пытается вызвать конструктор по умолчанию без переменных:

error: no matching function for call to 'Adafruit_HX8357::Adafruit_HX8357()' 

Я попытался изо всех сил решить эту проблему, но не имел никакого успеха. Любая помощь очень ценится!

Вот исходный код:

Display.cpp

#include "Display.h" 

Display::Display(int displayCSPin, int displayDCPin, int touchCSPin, int newBacklightPin, int newRotation, int newBrightness) : Adafruit_HX8357(displayCSPin, displayDCPin, -1), Adafruit_STMPE610(touchCSPin) 
{ 

    // tft = Adafruit_HX8357(displayCSPin, displayDCPin, -1); 
    //ts = Adafruit_STMPE610(touchCSPin); 
    tft.begin(HX8357D); 
    ts.begin(); 
    tft.setRotation(newRotation); 
    backlightPin = newBacklightPin; 
    pinMode(backlightPin, OUTPUT); 

    rotation = newRotation; 
    backgroundColor = HX8357_BLACK; 
    brightness = newBrightness; 

} 

Display.h

#ifndef DISPLAY_H_ 
#define DISPLAY_H_ 

#include "arduino.h" 
#include "Adafruit_GFX.h" 
#include "Adafruit_HX8357.h" 
#include "Adafruit_STMPE610.h" 

class Display : public Adafruit_HX8357, public Adafruit_STMPE610 { 
public: 
    Display(int displayCSPin, int displayDCPin, int touchCSPin, int newBacklightPin, int newRotation, int newBrightness); 

    void wake(); 
    void sleep(); 
    bool isAwake(); 
    void setBackGroundColor(int newColor); 
    int getBackgroundColor(); 
    void setBrightness(int newBrightness); 
    int getBrightness(); 
    void setRotation(int newRotation); 
    int getRotation(); 
    bool isTouched(); 
    Adafruit_HX8357 tft; 
    Adafruit_STMPE610 ts; 
    int backgroundColor; 

private: 
    int brightness; 
    int rotation; 
    int backlightPin; 
    bool awake; 
    bool touched; 
    TS_Point p; 

}; 
+0

Можете ли вы назвать несколько конструкторов суперкласса в одном конструкторе? –

+0

@RonThompson все базовые классы должны иметь вызванный конструктор. (Если они не упоминаются в списке инициализации, тогда они вызываются без аргументов) –

+0

@RonThompson: да, вы можете. –

ответ

0

Посмотрите на реальных конструкторами, доступных для Adafruit_HX8357 и Adafruit_STMPE610:

Adafruit_HX8357(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK, 
       int8_t _RST, int8_t _MISO); 
Adafruit_HX8357(int8_t _CS, int8_t _DC, int8_t _RST = -1); 

Adafruit_STMPE610(uint8_t cspin, uint8_t mosipin, uint8_t misopin, uint8_t clkpin); 
Adafruit_STMPE610(uint8_t cs); 
Adafruit_STMPE610(void); 

Ваш Display конструктор пытается вызвать второй конструктор каждого класса. Однако Display передает int значения, где ожидаются значения int8_t и uint8_t. Это звучит, как, возможно, ваш компилятор не выполняет неявное преобразование из int в (u)int8_t, поэтому попробуйте использовать явные преобразования, чтобы заставить его:

Display::Display(int displayCSPin, int displayDCPin, int touchCSPin, int newBacklightPin, int newRotation, int newBrightness) 
    : Adafruit_HX8357((int8_t)displayCSPin, (int8_t)displayDCPin, -1), 
     Adafruit_STMPE610((uint8_t)touchCSPin) 
{ 
    //Initialize display 
} 

В противном случае измените вас Display параметры конструктора использовать int8_t и uint8_t вместо int:

Display::Display(int8_t displayCSPin, int8_t displayDCPin, uint8_t touchCSPin, int newBacklightPin, int newRotation, int newBrightness) 
    : Adafruit_HX8357(displayCSPin, displayDCPin, -1), 
     Adafruit_STMPE610(touchCSPin) 
{ 
    //Initialize display 
} 
+1

Существует неявное преобразование между интегральными типами в C++, поэтому кажется вероятным, что что-то еще происходит –

+0

Я просто попробовал как листинг переменных, так и объявление их как 'int8_t', и, к сожалению, это не повлияло. – PlanetaryN

Смежные вопросы