Muszę zarejestrować obiekt w kontenerze po jego utworzeniu. Bez inteligentnych wskaźników użyję coś takiego:shared_from_this wywoływany z konstruktora
a_class::a_class()
{
register_somewhere(this);
}
z inteligentnymi wskaźników należy używać shared_from_this
ale nie mogę użyć tego w konstruktorze.
Czy istnieje clean sposób rozwiązania tego problemu? Co zrobiłbyś w podobnej sytuacji? myślę o wprowadzenie metody init
zadzwonić zaraz po stworzeniu i umieścić wszystko w funkcji fabrycznego jak ten:
boost::shared_ptr<a_class> create_a()
{
boost::shared_ptr<a_class> ptr(new a_class);
ptr->init();
return ptr;
}
czy to dobrze czy nie jest to standardowa procedura, aby postępować w takich przypadkach?
EDIT: W rzeczywistości mój przypadek jest bardziej złożony. Mam 2 obiekty, które będą utrzymywać wskaźniki wzajemnie. Prawda jest taka, że nie "rejestruję", ale tworzę kolejny obiekt (powiedzmy b_class
), który wymaga this
jako parametru. b_class
odbiera this
jako słaby wskaźnik i zapisuje go.
Dodaję to dlatego, ponieważ dajesz mi zaprojektować rad (które są bardzo cenione) przynajmniej można wiedzieć, co robię:
a_class::a_class()
{
b = new b_class(this);
}
W moim programie a_class
jest podmiotem i b_class
jest jedną z konkretnych klas reprezentujących stan (w konstruktorze jest to tylko stan początkowy). a_class
potrzebuje wskaźnika do bieżącego stanu i b_class
musi manipulować encją.
a_class
jest odpowiedzialny za tworzenie i niszczenie b_class przypadków, a tym samym utrzymuje shared_ptr do nich, ale b_class
trzeba manipulować a_class
a zatem zachowuje słabą wskaźnik. a_class
instancja "przeżywa" instancje b_class
.
Czy w tym przypadku sugerujesz unikanie używania inteligentnych wskaźników?
nie widzę dość twojej kod, ale oczywiste pytanie brzmi: dlaczego 'register_somewhere' potrzebuje inteligentnego wskaźnika? Zwykle jest to czystsze, jeśli obiekt nie zarządza własnym czasem życia (co oznacza, że zakładanie lub wymaganie, że będzie trzymane przez inteligentny wskaźnik, jest cienkim końcem klina). Cokolwiek tworzy obiekt, powinno decydować o strategii alokacji, statycznej, automatycznej, dynamicznej zarządzanej przez inteligentny wskaźnik itp. Jeśli możesz oddzielić rejestrację i własność, to tym lepiej. –
Proste rozwiązanie: sourceforge.net/projects/shared-from-this-ctor/ –