Позвольте мне предвосхитить это, сказав, что я из Java-фона, поэтому, пожалуйста, прости меня, если я допустил какую-то глупую ошибку здесь ...
Я пишу библиотеку C ++, которую яхотел бы сделать совместимым как с Arduino, так и с RaspberryPi.Большая часть кода просто чистая, стандартная C ++, но некоторые функции зависят от оборудования (например, вызовы GPIO).Я думал, что, основываясь на Java, я просто создам HAL-интерфейс, который определяет эти аппаратно-специфические функции, а затем я могу создать реализации этого интерфейса для RPi и Arduino, только чтобы понять, что интерфейсы - это не вещьв C ++, и вы должны использовать вместо этого виртуальные методы. Пожалуйста, ознакомьтесь с нижней частью моего вопроса относительно моих исходных файлов.
Однако, когда я начал использовать это, я обнаружил нечто довольно странное: использование HAL на компиляции кучи, но использованиеэто в стеке не
//THIS DOES NOT COMPILE
MyLibraryHAL hal = HAL_RaspberryPi();
hal.someHwSpecificFunction(65);
//BUT THIS DOES
MyLibraryHAL* hal = new HAL_RaspberryPi();
hal->someHwSpecificFunction(65);
Ошибка:
src.ino:67: undefined reference to MyLibraryHAL::someHwSpecificFunction(unsigned char)
.
Почему это?Это просто особенность работы виртуальных методов?Или есть какая-то концепция, которую я здесь упускаю?
MyLibraryHAL.h
#include <stdint.h>
#ifndef MyLibraryHAL_h
#define MyLibraryHAL_h
class MyLibraryHAL
{
public:
virtual void someHwSpecificFunction(uint8_t param);
};
#endif
HAL_Arduino.h
#include <stdint.h>
#include "MyLibraryHAL.h"
#ifndef HAL_Arduino_h
#define HAL_Arduino_h
class HAL_Arduino : public MyLibraryHAL
{
public:
void someHwSpecificFunction(uint8_t param);
};
#endif
HAL_Arduino.cpp
#include <stdint.h>
#include "HAL_Arduino.h"
void HAL_Arduino::someHwSpecificFunction(uint8_t param)
{
//do things
}
HAL_RaspberryPi.h
#include <stdint.h>
#include "MyLibraryHAL.h"
#ifndef HAL_RaspberryPi_h
#define HAL_RapsberryPi_h
class HAL_RaspberryPi : public MyLibraryHAL
{
public:
void someHwSpecificFunction(uint8_t param);
};
#endif
HAL_RaspberryPi.cpp
#include <stdint.h>
#include "HAL_RaspberryPi.h"
void HAL_RaspberryPi::someHwSpecificFunction(uint8_t param)
{
//do things
}