我面临着一个问题并放弃了几天的思考,我向你寻求可能的解决方案或想法。
我为AVR micro编写了一些类,它们具有用于编写和接收数据的标准函数,并使用它们来创建与STDIN和STDOUT一起使用的流。 stdio.h中文件结构的定义是:
struct __file {
char *buf; /* buffer pointer */
unsigned char unget; /* ungetc() buffer */
uint8_t flags; /* flags, see below */
int size; /* size of buffer */
int len; /* characters read or written so far */
int (*put)(char, struct __file *); /* function to write one char to device */
int (*get)(struct __file *); /* function to read one char from device */
void *udata; /* User defined and accessible data. */
};
我想用纯虚函数send
和receive
创建一个基类
(对于UART,网络,I2c)并将它们分配给文件结构的put
和get
函数。
我知道C和C ++签名不兼容,所以我需要一个解决方法。
由于文件结构的get
和put
参数已经声明,并且由于虚函数,我无法使用回调方法。实际上我可以声明一个静态指针,并从C函数回调send
和receive
成员函数,但它只适用于一个实例。
class Stream{
private:
FILE Stream;
static Stream* instance;
Stream(){
_stream.put=putChar;
_stream.get=getChar;
_stream.flags=_FDEV_SETUP_RW;
}
virtual int send(char c)=0;
virtual int receive()=0;
static int putchar(char c, FILE* stream){
return (instance->send(c));
}
static int getchar(FILE* stream){
return (instance->receive);
}
}
愚蠢的想法: 我对模板知之甚少,但可以用模板类完成吗?我想用一些模板解决方案来创建静态指针,但不知道怎么做。
或者说我的设计理念是死路一条是否更简单?
** Jarod42给了我解决方案:
您可以使用void *udata;
来存储实例指针(并在getchar
/ putchar
调用中转换回来)。 **