我需要将使用原始指针的双向链表的C实现转换为使用智能指针的实现。
我对智能指针有一些小经验。
我正在努力转换insertFirst()函数以获得我的方位并理解它将如何结合在一起。
struct node {
int data;
int key;
std::shared_ptr<node> next;
std::weak_ptr<node> prev;
};
void insertFirst(int key, int data){
//create a link
//struct node *link = (struct node*) malloc(sizeof(struct node));
std::shared_ptr<node> link = (std::shared_ptr<node>) malloc(sizeof(struct node));
link->key = key;
link->data = data;
if(isEmpty()){
//make it the last link
last = link;
}else {
//update first prev link
head->prev = link;
}
//point it to old first link
link->next = head;
//point first to new first link
head = link;
}
我遇到这条线的问题:
struct node *link = (struct node*) malloc(sizeof(struct node));
我觉得这样做:
std::shared_ptr<node> link = (std::shared_ptr<node>) malloc(sizeof(struct node));
是我所需要的。但我对C不熟悉,究竟发生了什么以及为什么不允许这样做。
我收到错误:
no matching conversion for C-style cast from 'void *' to 'std::shared_ptr<node>'
有人可以提供一些提示和解释吗?
答案 0 :(得分:4)
构建C++
类实例时,必须使用new
和delete
,而不是malloc
和free
。 malloc
和free
是C库函数,它们对C ++类构造函数,析构函数以及与C ++类完全相关的所有其他内容完全一无所知。
显示的代码正在尝试使用node
构建malloc
类的实例。这是行不通的。必须使用new
来构建它:
std::shared_ptr<node> link = new node;
这比由malloc
组成的C式混合物和一个丑陋的演员更加简洁整洁。
您提到您正在将C代码转换为C ++。该转化的必修部分是用malloc
和free
替换所有new
和delete
来电。这不是可选的,这是正确的C ++代码所必需的。