首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++多重继承,多重定义而不存在?

C++多重继承,多重定义而不存在?
EN

Stack Overflow用户
提问于 2015-02-22 03:44:44
回答 1查看 705关注 0票数 1

我正在为一个嵌入式C/C++项目实现硬件驱动程序,并试图为将来的项目做一些更灵活的事情。

我在LCD.hpp/LCD.cpp中完成了大部分工作,其中有一个具有五个虚拟函数的类。其中四个用于摆弄GPIO引脚和发送SPI消息,第五个用于实现各种字体。一个简短的类声明如下:

代码语言:javascript
复制
//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。

代码语言:javascript
复制
//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

现在是时候介绍各种硬件了。

代码语言:javascript
复制
//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中...

代码语言:javascript
复制
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的一个实现……

EN

回答 1

Stack Overflow用户

发布于 2015-02-22 06:14:55

这是由于LCD_meta和LCD_hardware在同一个头文件中造成的。LCD_hardware函数的代码在一个实现文件中,所以LCD_meta类实际上还没有定义这些函数……每个文件一个类!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28650479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档