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-06 23:22
1

Problem XY? Skąd kompilator ma wiedzieć o klasie Circle, jeśli mu nie Dołączysz tej klasy?


Pozostało 580 znaków

2019-11-06 23:27
0
lion137 napisał(a):

Problem XY? Skąd kompilator ma wiedzieć o klasie Circle, jeśli mu nie Dołączysz tej klasy?

No własnie w tym problem, że nie wiem. Tak jak w poście wyżej:

#pragma once
//#include "Circle.h" // bez dołączania klasy Circle program się kompiluje ale gdy usunę komentarz program nie się nie kompiluje.
class Containter

Jak dołączam mu tą klasę to nie działa. Mogę tylko dołączyć do "Circle" klasę "Containter", a jak chcę jeszcze dołączyć w do "Containter" klasę "Circle" to nie działa. Myślałem, że "pragma once" rozwiąże problem ale nie pomogło.


Brak polskich znakow :(
edytowany 1x, ostatnio: qblacksheep, 2019-11-06 23:29

Pozostało 580 znaków

2019-11-06 23:37
1

Odsyłam: https://en.wikipedia.org/wiki/Pragma_once


Dzięki :) Ale to nie pomoże mi rozwiązać problemu. Pozdrawiam - qblacksheep 2019-11-06 23:40
He, he, Zaplanuj sobie projekt, Postaw klasyczny "strażnik nagłówka", a potem Eksperymentuj. - lion137 2019-11-06 23:43

Pozostało 580 znaków

2019-11-06 23:53
kq

Chcesz użyć forward deklaracji. Powątpiewam, czy to rozwiązanie rzeczywistego problemu, ale jest to rozwiązanie problemu, o który pytałeś.

// foo.h

struct bar;
struct foo
{
    void x(bar const&);
};

// bar.h

struct foo;
struct bar
{
    void x(foo const&);
};

edytowany 1x, ostatnio: kq, 2019-11-06 23:54
Deklaracja wyprzedzająca mu nie pomoże w kodzie który pokazał - w obu klasach chce mieć obiekt jako wartość... - Bartłomiej Golenko 2019-11-07 00:04
No to interfejs/unique_ptr jakiś i tyle. Albo referencja :​/ Bezpośrednio wartości się nie da i tyle. - kq 2019-11-07 00:05

Pozostało 580 znaków

2019-11-07 00:05
3

Pozwól, że zapytam o jedną rzecz - DLACZEGO chcesz, żeby Circle zawierało w sobie Container ?

Potrzebuje dlatego, ze jest to projekt GUI na erkan dotykowy na STM32. Circle jest kontrolka, zeby wewnatrz tego stworzyc containter z malymi przyciskami musze go do dodac do widoku glownego z poziomu klasy Circle. Troche zagmatwane ale mam nadzieje, ze zrozumiales. - qblacksheep 2019-11-07 07:13

Pozostało 580 znaków

2019-11-07 00:14
1

Użyj wzorca obserwatora: https://sourcemaking.com/design_patterns/observer/cpp/3


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

Pozostało 580 znaków

2019-11-07 07:20
0

Dzieki wszystkim za odpowiedzi, bede dzisiaj kombinowal. Z tego co widze nie ma prostego rozwiazania. Myslalem, ze moze jest jakis trick z "#include", ktory szybko rozwiaze problem.
Mam jeszcze jeden pomysl stworzenia trzeciej klasy, ktora by aktualizowala wartosci klas Cricle i Contatiner. Wrzuce rozwiazanie jak sie uda.

Pomijajac problem aktualizowania wartosci i tworzenia obiektow w klasach. Moglby mi ktos wytlumaczyc dlaczego dolaczenie plikow naglowkowych w obu klasach powoduje blad?
tzn.

plik Circle.h

#include "Container.h"
Class Circle {
}

plik Containter.h

#include "Circle.h"   // dodanie tego powoduje blad
Class Containter {
}

Brak polskich znakow :(
edytowany 3x, ostatnio: qblacksheep, 2019-11-07 07:30

Pozostało 580 znaków

2019-11-07 08:16
3

No bo masz cykliczną zależność, @kq Ci napisał jak to obejść. Include = weź zawartość pliku i ją wklej w miejsce dyrektywy. No to do Container.h kleisz Circle.h, które zawiera Container.h, które zawiera Circle.h i tak ad mortem defecatum. Zrobiłeś sobie przedzidzie śródzidzia zadzidzia przedzidzia śródzidzia zadzidzia przedzidzia (...) dzidy bojowej.

Pozostało 580 znaków

2019-11-07 10:41
2

Raczej nie najlepsze rozwiązanie, ale powinno działać.

//Circle.hh

class Container;

class Circle{
    Container *container;
}

//Circle.cc
#include "Container.hh"
//Container.hh

class Circle;

class Container{
    Circle *circle;
}

//Container.cc
#include "Circle.hh"
edytowany 2x, ostatnio: Nunn, 2019-11-07 10:45

Pozostało 580 znaków

2019-11-07 11:31
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?


Brak polskich znakow :(

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