Korzystanie z obiektu klasy A w klasie B i odwrotnie.

0

Dziekuje wszystkim za pomoc. Udalo mi sie rozwiazac problem korzystajac z forward declaration. Wyglada to troche skomplikowanie i niezbyt czytelnie.
Czy w komercyjnym kodzie stosujecie forward declaration czy powinno sie tego unikac?

1

Nie wiem jak w komercyjnym kodzie ale troche w c++ programowalem i dla mnie to tez nieczytelne.
Ale dziala i nawet jest stosowane.
Chyba mozna to podciagnac pod "rozwiazanie idiomatyczne".

3

Jak najbardziej jest to rozwiązanie idiomatyczne. Przede wszystkim, pozwala uniknąć zaciągania kolejnych include'ów i znacznie przyspiesza kompilację/rekompilację. (Jeśli zmieniło się foo.h, to a includuje go bar.h to wszystko includujące bar.h też zostanie przekompilowane). Ponadto, w mojej opinii zwiększa czytelność, ponieważ poprawnie stosowane pozwala od razu stwierdzić w jaki sposób dany typ jest wykorzystywany i jak głęboka jest od niego zależność.

Ale i tak nie mogę doczekać się modułów.

0

Witam ponownie. Pierwotny problem rozwiazalem ale zeby nie tworzyc nowego tematu dodam tutaj pytanie. Czy dobrze tworze obiekt klasy Container? Jezeli tak to gdzie zwolnic pamiec? w destruktorze?


class Circle
{
     Containter* container;
public:
    Circle();
};

Circle::Circle()
{
    containter = new Containter();
}
1

Najlepiej to by było użyć unique_ptr albo shared_ptr i pozwolić ich destruktorom to zrobić. O ile musisz to robić na stercie, bo może pole typu Container zamiast Container* styka.

0
alagner napisał(a):

Najlepiej to by było użyć unique_ptr albo shared_ptr i pozwolić ich destruktorom to zrobić. O ile musisz to robić na stercie, bo może pole typu Container zamiast Container* styka.

Pole nie wystarczy niestety bo przy tworzeniu obiektu musze do konstruktora przekazac parametr. Poczytam o smart pointerach :)

1

Użyj według poniższego schematu, gdzie p1,p2,p3 są parametrami przekazywanymi do konstruktora obiektu Container

class Circle
{
     unique_ptr<Containter> container {nullptr};
public:
    Circle();
};

Circle::Circle()
{
    containter = make_unique<Containter>( p1 , p2  , p3 );
}
0
TomaszLiMoon napisał(a):

Użyj według poniższego schematu, gdzie p1,p2,p3 są parametrami przekazywanymi do konstruktora obiektu Container

Powinienem uzyc unique_ptr czy shared_ptr? Przeczytalem, krotki wstep do smart pointerow i wyglada jakby shared_ptr bardziej pasowal. Dobrze mysle?

class Circle
{
    std::shared_ptr<Container> container;
public:
    Circle();
};

Circle::Circle()
{
    container= std::shared_ptr<Container>(new Container());
}
2

Jeżeli obiekt container nie będzie udostępniany na zewnątrz klasy Circle to wystarczy unique_ptr. Jeżeli planujesz użycie większej ilości wskaźników przypisanych do tego obiektu - użyj shared_ptr.
Do tworzenia wskaźnika zalecane jest używanie funkcji szablonowych make_unique<> , make_shared<>.

class Circle
{
     shared_ptr<Containter> container {nullptr};
public:
    Circle();
};

Circle::Circle()
{
    containter = make_shared<Containter>( p1 , p2  , p3 );
}

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: CCBot