C++ множественное наследование, множественное определение, когда нет?

Я реализую аппаратные драйверы для встроенного проекта 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...

1 ответ

Это было вызвано наличием LCD_meta и LCD_hardware в одном заголовочном файле. Код для функций LCD_hardware был в файле реализации, поэтому класс LCD_meta еще не определил эти функции... Один класс на файл!

Другие вопросы по тегам