我已经开始了一个arduino项目,我想将我的代码包装成某种类,以保持简单和可维护。
我创建了一个处理LCD I2C屏幕的类,我称之为ScreenManager。
ScreenManager.h
#ifndef Morse_h
#define Morse_h
#include "Arduino.h"
#include "LiquidCrystal_I2C.h"
class ScreenManager
{
public:
ScreenManager();
void display_current_date();
void display_welcome_message();
private:
LiquidCrystal_I2C lcd;
};
#endif
ScreenManager.c
#include "ScreenManager.h"
#include "Arduino.h"
#include "LiquidCrystal_I2C.h"
ScreenManager::ScreenManager()
{
lcd = LiquidCrystal_I2C(0x27, 16, 2);
}
void ScreenManager::display_current_date(){
lcd.print("01-09-2015 11:35");
}
void ScreenManager::display_welcome_message()
{
lcd. print("Hi! What can I do fo you?");
}
当我编译时,我收到以下错误:
avr-gcc -Wall -gdwarf-2 -fsigned-char -MD -MP -DF_CPU=8000000 -I arduino -I .. -DARDUINO=105 @arduino/libs.inc -O1 -mmcu=atmega328p -o "ScreenManager.o" -c "../ScreenManager.cpp"
In file included from ../ScreenManager.cpp:1:
../ScreenManager.h: In constructor 'ScreenManager::ScreenManager()':
../ScreenManager.h:10: error: no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C()'
../LiquidCrystal_I2C.h:71: note: candidates are: LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t, uint8_t)
../LiquidCrystal_I2C.h:60: note: LiquidCrystal_I2C::LiquidCrystal_I2C(const LiquidCrystal_I2C&)
make: *** [ScreenManager.o] Error 1
Error code 2
我做错了什么?
答案 0 :(得分:0)
ScreenManager::ScreenManager()
{
lcd = LiquidCrystal_I2C(0x27, 16, 2);
}
应该是
ScreenManager::ScreenManager() : lcd(0x27, 16, 2 /*, 4th parameter */)
{
}
ScreenManager.c应该是ScreenManager.cpp
答案 1 :(得分:0)
您的私有成员lcd会调用 LiquidCrystal_I2C 类的默认构造函数。 但是这个类只有一个带参数的构造函数或一个复制构造函数。
因此初始化构造函数初始化列表中的成员。
ScreenManager::ScreenManager()
: lcd(0x27, 16, 2)
{
}
答案 2 :(得分:0)
在头文件中声明私有成员变量时,如下所示:
class ScreenManager
{
public:
...
private:
LiquidCrystal_I2C lcd;
};
当您的类初始化时,C ++会自动尝试调用该类的默认构造函数。由于LiquidCrystal_I2C
未声明默认构造函数,因此当它尝试执行此默认初始化时,会抛出您看到的错误。
另一种方法是使用指针到LiquidCrystal_I2C
:
class ScreenManager
{
public:
...
private:
LiquidCrystal_I2C *lcd;
};
然后在构造函数中使用参数构造new
对象:
ScreenManager::ScreenManager()
{
lcd = new LiquidCrystal_I2C(0x27, 16, 2);
}
之后,你只需要在你的类中添加一个析构函数,这样你的LiquidCrystal_I2C
对象就会在你完成后被处理掉:
// in header
class ScreenManager
{
public:
...
~ScreenManager();
...
private:
LiquidCrystal_I2C lcd;
};
// in source
ScreenManager::~ScreenManager()
{
delete lcd;
}