生ポインタを使用する二重リンクリストの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>'
誰もがいくつかのヒントや説明を提供することはできますか? C++
クラスのインスタンスを構築する場合
'std :: make_shared'(または少なくとも' new')を使うべきであるため、 'node'に' malloc'を使用することはできません。 Btw本当に*共有*ポインタが必要ですか? – Galik
共有ポインタは必要ありませんが、C++ 11の導入以来、 'new'と' delete'を使う代わりに 'shared_ptr'と' make_shared'を使う方がプロフェッショナルです –