我正在为嵌入式C / C ++项目实现硬件驱动程序,并试图为未来的项目提供更灵活的功能。
我在LCD.hpp / LCD.cpp中完成了大部分工作,其中有一个具有五个虚函数的类。其中四个用于处理GPIO引脚和发送SPI消息,第五个用于实现各种字体。缩短的类声明如下:
//LCD.hpp
#include <cstdint>
#ifndef LCD_HPP
#define LCD_HPP
class LCD {
public:
virtual void write_character(char what) = 0; //Stores data into a buffer in LCD through another function
protected:
virtual void SPI_TX(uint8_t *TXData, uint8_t length, bool ToBeContinued) = 0;
virtual void update_RST(bool pinstate) = 0;
virtual void update_DC(bool pinstate) = 0;
virtual void update_backlight(uint8_t brightness) = 0;
};
#endif
继续,我实现了字体打印write_character。
//LCD_FixedWidth.hpp
#include <cstdint>
#include "LCD.hpp"
#ifndef LCD_FIXEDWIDTH_HPP
#define LCD_FIXEDWIDTH_HPP
class LCD_FixedWidth : virtual public LCD {
public:
void write_character(char what);
};
#endif
现在是时候处理各种硬件了。
//LCD_hardware.hpp
#include <cstdint>
#include "LCD.hpp"
#include "LCD_FixedWidth.hpp"
#ifndef LCD_HARDWARE_HPP
#define LCD_HARDWARE_HPP
class LCD_hardware : virtual public LCD {
protected:
void SPI_TX(uint8_t *TXData, uint8_t length, bool ToBeContinued);
void update_RST(bool pinstate);
void update_DC(bool pinstate);
void update_backlight(uint8_t brightness);
};
然后是一个将它们组合在一起的类,仍然在LCD_hardware.hpp ......
class LCD_meta : public LCD_hardware, public LCD_FixedWidth {
public:
void write_character(char what) { LCD_FixedWidth::write_character(what); };
protected:
void SPI_TX(uint8_t *TXData, uint8_t length, bool ToBeContinued) { LCD_hardware::SPI_TX(TXData, length, ToBeContinued); };
void update_RST(bool pinstate) { LCD_hardware::update_RST(pinstate); };
void update_DC(bool pinstate) { LCD_hardware::update_DC(pinstate); };
void update_backlight(uint8_t brightness) { LCD_hardware::update_backlight(brightness); };
};
#endif
对于所有这些,我得到了LCD_FixedWidth :: write_character(char)错误的多重定义。有人看到我在这里失踪的任何东西吗?我的所有标题都被正确保护,我只能看到write_character的一个实现......
答案 0 :(得分:0)
这是因为LCD_meta和LCD_hardware位于同一个头文件中。 LCD_hardware函数的代码在一个实现文件中,所以LCD_meta类实际上还没有定义那些函数......每个文件一个类!