将C ++类成员函数分配给C struct function指针

时间:2015-10-29 08:53:09

标签: c++ stream virtual avr

我面临着一个问题并放弃了几天的思考,我向你寻求可能的解决方案或想法。

我为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. */
    };

我想用纯虚函数sendreceive创建一个基类 (对于UART,网络,I2c)并将它们分配给文件结构的putget函数。

我知道C和C ++签名不兼容,所以我需要一个解决方法。 由于文件结构的getput参数已经声明,并且由于虚函数,我无法使用回调方法。实际上我可以声明一个静态指针,并从C函数回调sendreceive成员函数,但它只适用于一个实例。

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调用中转换回来)。 **

0 个答案:

没有答案