我在C中实现了一个包含许多功能的链表,以帮助简化操作 我不想将此功能移植到C ++中,所以我试图创建一个内部调用原始函数的简单Wrapper类,并在内部操作 C 链接列表。
对于大多数功能,包装器代码运行良好。然而,有一个问题。 C链表结构有指向下一个和前一个 C 链表结构的指针,我希望能够获得C ++等效类指针。
我该怎么做?
E.x:有一个C函数可以获取索引链中的链表。原始函数会执行以下操作:
struct _linkedlist *LinkedList_get(struct _linkedlist * list, const unsigned long index)
{ /* Gets the index'th linked list in the chain as a pointer */
if ((list) == NULL) return NULL;
if (index >= LinkedList_get_depth(list))
return NULL;
for(unsigned int i = 0; i < index; list = list->next, ++i);
return list;
}
该函数清楚地返回指向链表C struct的指针。我想要做的是获取指向C ++链表包装器对象的指针。
这样做的全部目的是,我可以围绕纯功能接口(C接口)创建面向对象的包装器(C ++接口),而无需更改原始源(C版本)。
答案 0 :(得分:0)
您在评论中提到您的C链表存储了任意值类型(void*
)。因此,C ++包装器在该值类型中存储额外信息应该是相当简单的。这些额外信息可能是指向相应C ++包装器的指针。
您还没有展示您的代码,因此我将以通用的方式展示这个想法:
// This is the original C interface
struct C_Node;
void* c_getValue(struct C_Node *node);
struct C_Node* c_insertAfter(struct C_Node *node, void *value);
// This is the C++ wrapper
template <class T>
class Node
{
C_Node *cNode;
typedef std::pair<T, Node*> ProxyValueType;
explicit Node(C_Node *cNode) : cNode(cNode)
{
static_cast<ProxyValueType*>(c_getValue(cNode))->second = this;
}
public:
T& getValue() const
{ return static_cast<ProxyValueType*>(c_getValue(cNode))->first; }
Node* insertAfter(T value)
{
ProxyValueType *proxy = new ProxyValueType(T, nullptr);
C_Node *newNode = c_insertAfter(cNode, proxy);
return new Node(newNode);
}
};
当然,上面写的是坏 C ++,因为它使用拥有的原始指针等。把它看作是一个想法的演示,而不是可交代的代码。