Korzystanie z obiektu klasy A w klasie B i odwrotnie.

Odpowiedz Nowy wątek
2019-11-06 23:08
0

Witam,
mam problem z klasami w C++. Chce korzystac z metod klasy B w klasie A i odwrotnie.
Problem mam już z dołączaniem plików nagłówkowych.

//**************** header klasy Containter
#pragma once
#include "Containter.h"
class Circle
{
        int circleValue;
public:

    Containter container; 
    Circle();
    ~Circle();
     void SetCricleValue(int value)

};

//**************** header klasy Circle
#pragma once
//#include "Circle.h" // bez dołączania klasy Circle program się kompiluje ale gdy usunę komentarz program nie się nie kompiluje.
class Containter
{
         int containterValue;
public:
    //Circle circle;
    Containter();
    ~Containter();
    void SetContainterValue(int value);
};

W jaki sposób mogę utworzyć obiekt klasy Circle w klasie Containter bez dołączenia "Circle.h"? Gdy tego nie zrobię wewnątrz klasy Container nie mam dostępu do Cricle.
Nie chcę używać tutaj dziedziczenia bo te klasy mają inne zadania.
Potrzebuje tylko aktualizować stan obiektu przez wywoływanie metod - w klasie Circle musze wywołać UpdateContainterValue() z klasy Containter, a w klasie Containter UpdateCircleValue().

Z góry dziękuję za pomoc.
Pozdrawiam


Brak polskich znakow :(

Pozostało 580 znaków

2019-11-07 11:37
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".


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2019-11-07 11:48
kq
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.


edytowany 1x, ostatnio: kq, 2019-11-07 11:50

Pozostało 580 znaków

2019-11-08 08:49
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();
}

Brak polskich znakow :(
edytowany 1x, ostatnio: qblacksheep, 2019-11-08 08:49
Jeśli nie wykorzystasz smart pointerów, to musisz w destruktorze sprawdzić czy container != nullptr i zwolnić pamięć. - Nunn 2019-11-08 09:10

Pozostało 580 znaków

2019-11-08 09:03
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.

Pozostało 580 znaków

2019-11-08 09:31
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 :)


Brak polskich znakow :(

Pozostało 580 znaków

2019-11-08 09:40
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 );
}

Pozostało 580 znaków

2019-11-08 09:45
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());
}

Brak polskich znakow :(
edytowany 2x, ostatnio: qblacksheep, 2019-11-08 09:48

Pozostało 580 znaków

2019-11-08 10:02
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 );
}
Dzieki za wyjasnienie. Calkiem przyjemne te smart pointery :D - qblacksheep 2019-11-08 10:03

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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