包装类成员访问

时间:2012-12-08 02:15:22

标签: c struct queue wrapper member

所以我有一个带有sentinel节点的通用双链接队列结构:

// Queue node:
struct _QNode {
    struct _QNode *prev;     /* Previous list element. */
    struct _QNode *next;     /* Next list element.    */
};
typedef struct _QNode QNode;

// Queue object:
struct _Queue {
    QNode front;    // sentinel node at the front of the queue
    QNode rear;     // sentinel node at the tail of the queue
};

一个“duct-tape”结构,用于将整数值加载到队列节点

struct _Tape {
    int32_t payload;    // user data field
    QNode node;       // generic node
};

一个结合了两者的包装类IntegerQueue。

我的问题是如何访问您尝试弹出的给定节点的有效负载变量?

2 个答案:

答案 0 :(得分:1)

有了你所拥有的,你可以建立很好的QNode列表。但是如果你有这样的QNode队列,你只能访问其中的QNode,而不是你的磁带,至少不能以一种可接受的方式访问(你可以说,每个QNode都包含在一个Tape-struct中,因此减去一些从QNode的地址获取磁带地址的值,但是如果有人看到它,那就会让你开枪。)
所以我认为你有办法将你的有效负载放入QNode。如果您使用C ++,那么您可以使用模板以通用方式执行此操作,在这里您可以使用宏,或者在Queue内部使用void-pointer然后将其强制转换为您的有效负载类型(这会再次让您拍摄)。 / p>

答案 1 :(得分:0)

正统的处理方式是:

typedef struct QNode QNode;
struct QNode
{
    QNode *prev;     /* Previous list element. */
    QNode *next;     /* Next list element.     */
    void  *data;     /* Data for this node     */
};

这可用于存储指向任何数据类型(结构或简单类型)的指针。然后,您可以为这种泛型类型在队列周围创建一个类型安全的包装器。请注意,这是非侵入性的;它不会改变排队的类型,这通常是有益的。需要注意的是:如果您计划存储int32_t,那么指针将至少使用与数据一样多的空间(64位机器上的指针为8个字节,数据为4个字节)。使用专用类型(QNodeInt32)直接存储值会更经济。通用主义往往需要空间。