覆盖c struct中的继承函数

时间:2016-03-04 17:13:49

标签: c++ c pointers inheritance struct

好吧,所以我在one.h中有这个结构

typedef struct NWK_DataReq_t
{
    uint16_t     dstAddr;
    uint8_t      options;
    uint8_t      *data;
    uint8_t      size;

    void         (*confirm)(struct NWK_DataReq_t *req);
} NWK_DataReq_t;

稍后,在two.h中,有一些结构从NWK_DataReq_t继承:

#include "one.h"

struct commandReq_t : public NWK_DataReq_t {
    ...
}

struct dataReq_t : public NWK_DataReq_t {
    ...
}

我的目标是在为NWK_DataReq_t的某些变量设置默认值并向结构中添加变量时继承NWK_DataReq_t的结构。到目前为止,为变量分配默认值可以按预期工作。我遇到麻烦的一点是分配(*确认) 功能

struct commandReq_t : public NWK_DataReq_t {
    uint16_t   dstAddress  = 2;
    uint8_t    options     = 8;

    void       confirm     = commandReqConf;

    char       newVar[20]   = "Hello";
} commandReq;

...

void commandReqConf(NWK_DataReq_t *req);

我不知道如何设置默认函数来覆盖它。我的目标是将commandReqConf设置为(*confirm)函数,并将其传递给NWK_DataReq_t

我希望这是有道理的,任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

恕我直言,正如您撰写struct commandReq_t : public NWK_DataReq_t {并将问题标记为,您现在处于c ++世界。

恕我直言,初始化对象的最简单方法是在构造函数中:

struct commandReq_t : public NWK_DataReq_t {
    commandReq_t() { // default ctor
        dstAddr = 2;
        options = 8;
        strcpy(newVar, "Hello");
        confirm     = &commandReqConf;
    }

    char       newVar[20];  // initialized at ctor initialization time
} commandReq;
...
static void commandReqConf(NWK_DataReq_t *req);

因为函数commandReqConf实际上是类CzarController的成员,它应该是静态的 - 但如果它与结构包含在同一个类中则不需要限定。

答案 1 :(得分:1)

uint16_t   dstAddress  = 2;
uint8_t    options     = 8;

void       confirm     = commandReqConf;

char       newVar[20]   = "Hello";
commandReq_t的定义中的

struct的成员。他们是其他成员。它们不会覆盖NWK_DataReq_t中的成员。鉴于此,该行

void       confirm     = commandReqConf;
两个帐户

错误。

  1. 您无法创建void类型的成员变量。
  2. 您无法指定将void返回confirm
  3. 的函数

    您需要做的是在构造函数中设置成员的值。

    struct commandReq_t : public NWK_DataReq_t {
    
       commandReq_t()
       {
          dstAddr = 2;
          options = 8;
          confirm = commandReqConf;
          strcpy(newVar, "Hello");
       }
       char  newVar[20];
    } commandReq;