eine C-Bibliothek Betrachten Sie die Funktionen zum Erstellen, zu zerstören und die Arbeit mit einer benutzerdefinierten StrukturC++ Smart-Pointers verwenden mit wechselnden Zeigerwerte
struct Foo;
void foo_action(Foo*);
Foo* foo_create();
void foo_free(Foo*);
Zeit definiert, benutzte ich die Bibliothek in meinem C++ Projekt als
folgtFoo* myfoo = foo_create();
foo_action(myfoo);
foo_free(myfoo);
Ich verstehe, warum Smart Pointer wichtig sind und möchten meinen Code migrieren, um sie zu verwenden. So sieht der Code jetzt aus.
#include <memory>
#include <functional>
typedef std::unique_ptr<Foo, std::function<void(Foo*)>> FooPtr;
// ...
FooPtr myfoo2(foo_create(), foo_free);
foo_action(myfoo2.get());
Es scheint zu funktionieren, aber die myfoo2.get()
Aufruf scheint hacky. Verwende ich es wie vorgesehen?
Es gibt einen anderen Teil der Bibliothek, der mit einer Art Listenstruktur erstellt und arbeitet. Die api sieht aus wie
struct Bar;
Bar* bar_append(Bar*, int);
void bar_free_recursive(Bar*);
und wird als
// using NULL as current Bar* creates the initial structure
Bar* bar = bar_append(NULL, 1);
// each invocation leads to another 'head' structure
bar = bar_append(bar, 42);
bar = bar_append(bar, 123);
Als Zeiger (die Adresse zeigte auf) ändert sich mit jeder bar_append
Aufruf verwendet, wie würde ich intelligente Zeiger hier einführen, so dass bar_free_recursive
aufgerufen wird auf dem aktuellen Zeigerwert, wenn die Zeigerinstanz freigegeben wird?
Denken Sie daran, dass Sie * Überlastung * Funktionen. Warum nicht eine einfache Inline-überladene 'foo_action'-Funktion erstellen, die ein' FooPtr'-Argument verwendet und einfach die alte 'foo_action'-Funktion mit dem rohen nicht-intelligenten Zeiger aufruft? Sie können weiterhin den alten Code behalten, während Sie die Schnittstelle netter machen. –
@Someprogrammerdude guten Punkt, danke. Ich war mir nur nicht sicher, ob es überhaupt erforderlich ist, oder ob es einen direkteren Weg für die Konvertierung gibt. – muffel
@muffel Wenn Sie modernes C++ verwenden, sollten Sie 'using' anstelle von' typedef' verwenden. – tambre