C ++无法为自定义类类型创建变量

时间:2015-09-01 14:52:50

标签: c++ arduino

我已经开始了一个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

我做错了什么?

3 个答案:

答案 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;
}