2016-10-21 4 views
0

Ich muss eine C-Implementierung einer doppelt verknüpften Liste, die unformatierte Zeiger verwendet, in eine Implementierung mit intelligenten Zeigern konvertieren.Konvertieren der verknüpften Liste von unformatierten Zeigern in intelligente Zeiger

Ich habe einige kleine Erfahrung mit intelligenten Zeigern.

Ich arbeite an Umwandlung der insertFirst() -Funktion, um meine Orientierung zu bekommen und zu verstehen, wie dies zusammen kommen wird.

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; 
} 

Im Probleme mit dieser Zeile:

struct node *link = (struct node*) malloc(sizeof(struct node));

dachte ich, wie so tun:

std::shared_ptr<node> link = (std::shared_ptr<node>) malloc(sizeof(struct node));

alles war ich brauchen würde. Aber ich bin weniger vertraut mit C und was genau passiert und warum das nicht erlaubt ist.

ich den Fehler:

no matching conversion for C-style cast from 'void *' to 'std::shared_ptr<node>'

Kann jemand ein paar Tipps und Erläuterungen bieten?

+0

Sie können 'malloc' nicht für' node' verwenden, da es nicht richtig aufgebaut wird, sollten Sie 'std :: make_shared' (oder mindestens' new') verwenden. Btw brauchst du wirklich * geteilte * Zeiger? – Galik

+0

Sie benötigen keine geteilten Zeiger, aber seit der Einführung von C++ 11 ist es professioneller, 'shared_ptr'' weak_ptr' und 'make_shared' anstelle von' new' und 'delete' zu ​​verwenden. –

Antwort

4

Beim Bau C++ Klasseninstanzen, müssen Sie new und delete verwenden, statt malloc und free. malloc und free sind C-Bibliotheksfunktionen, die absolut nichts über C++ - Klassenkonstruktoren, Destruktoren und alles andere wissen, was mit einer C++ - Klasse zusammenhängt.

Der angezeigte Code versucht, eine Instanz der Klasse node mit malloc zu erstellen. das wird nicht funktionieren. new muss es zu konstruieren, verwendet werden:

std::shared_ptr<node> link = new node; 

Das ist sogar noch kürzer und übersichtlicher, als das Gebräu C-Stil malloc besteht, und einem hässlichen gegossen.

Sie haben erwähnt, dass Sie C-Code in C++ konvertieren. Ein obligatorischer Teil dieser Konvertierung besteht darin, alle Anrufe malloc und free durch new und delete zu ersetzen. Dies ist nicht optional, dies ist für den richtigen C++ - Code erforderlich.

+0

Vielen Dank für den schnellen Antwort. Ich habe einen guten Artikel gefunden, den ich lesen muss, um ein besseres Verständnis für die Verwendung geteilter Zeiger zu bekommen. Ich glaube, dass das Ziel hier ist, alle Aufrufe von "new" und "delete" zu eliminieren und stattdessen alle Zuweisungen und Freigaben mit 'shared_ptr' und' make_shared' durchzuführen –

Verwandte Themen