2016-10-21 2 views
0

生ポインタを使用する二重リンクリストの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++クラスのインスタンスを構築する場合

+0

'std :: make_shared'(または少なくとも' new')を使うべきであるため、 'node'に' malloc'を使用することはできません。 Btw本当に*共有*ポインタが必要ですか? – Galik

+0

共有ポインタは必要ありませんが、C++ 11の導入以来、 'new'と' delete'を使う代わりに 'shared_ptr'と' make_shared'を使う方がプロフェッショナルです –

答えて

4

、あなたはnewdelete、代わりのmallocfreeを使用する必要があります。 mallocfreeは、C++クラスのコンストラクタ、デストラクタ、およびC++クラスのすべてが対象とするその他のものについては絶対に何も知らないCライブラリ関数です。

示されたコードはmallocを使用してnodeクラスのインスタンスを構築しようとしています。それは動作しません。 newは、それを構築するために使用する必要があります。

mallocで構成されるCスタイルの調合、および醜いキャストよりも短く、すっきりです
std::shared_ptr<node> link = new node; 

あなたはCコードをC++に変換していると述べました。その変換の必須部分は、すべてmallocfreenewdeleteと置き換えることです。これはオプションではなく、これは適切なC++コードに必要です。

+0

ありがとう応答。私は共有ポインタの使用についてさらに理解するために読んでおくべき良い記事を見つけました。ここでの目標は、 'new'と' delete'への呼び出しを取り除き、代わりに 'shared_ptr'と' make_shared'ですべての割り当てと解放を実行することです –

関連する問題