Rozważmy biblioteki C, która definiuje funkcje do tworzenia, niszczenia i pracy ze strukturą niestandardowegoC++ używać inteligentne kursory ze zmianą wskaźnika wartości
struct Foo;
void foo_action(Foo*);
Foo* foo_create();
void foo_free(Foo*);
Obecnie użyłem biblioteki w moim C++ projektu następująco
Foo* myfoo = foo_create();
foo_action(myfoo);
foo_free(myfoo);
Rozumiem, dlaczego inteligentne wskaźniki są ważne i chcę przenieść mój kod, aby z nich korzystać. Tak właśnie wygląda kod.
Wydaje się działać, ale wywołanie myfoo2.get()
wydaje się być hacky. Czy używam go zgodnie z przeznaczeniem?
Istnieje inna część biblioteki, która tworzy i działa z jakąś strukturą listy. Api wygląda
struct Bar;
Bar* bar_append(Bar*, int);
void bar_free_recursive(Bar*);
i służy jako
// 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);
Jako wskaźnik (adres wskazany) zmienia się z każdym bar_append
inwokacji, jaki chciałbym przedstawić tutaj inteligentne kursory, tak że bar_free_recursive
jest wywoływany na bieżącej wartości wskaźnika po zwolnieniu instancji wskaźnika?
Pamiętaj, że możesz przeciążenie * * funkcje. Dlaczego nie utworzyć prostej, wbudowanej przeciążonej funkcji 'foo_action', która pobiera argument' FooPtr' i po prostu wywołuje starą funkcję 'foo_action' z surowym, nie-inteligentnym wskaźnikiem? Nadal można zachować stary kod, a interfejs jest ładniejszy. –
@Someprogrammerdude dobry punkt, dzięki. Po prostu nie byłem pewien, czy jest to w ogóle wymagane, czy też jest bardziej przejrzysty sposób na konwersję. – muffel
@muffel Jeśli używasz nowoczesnego C++, powinieneś używać 'using' zamiast' typedef'. – tambre