[C++] Jak zrobić wzajemnie zawierające się klasy?


(Kamiljano) #1

Problem w przypadku C# jest wręcz trywialny, w C++ męczy mnie od dość dawna.

Mam klasy A i B. Czy jest możliwe, żeby klasa A zawierała obiekt typu B, zaś klasa B zawierała w sobie obiekt typu A? Jeśli tak, to jak to zapisać?


(Tomek Matz) #2

Możesz podać przykład zastosowania? Ja w C# znam dwa rodzaje relacji między klasami, a dokładnie is a oraz has a. To co podałeś nie podchodzi mi pod żadną z tych definicji.


(Kamiljano) #3

chodzi mi o coś takiego:

class A{

B *b;

};


class B{

A *a;

}

i tyle.


(Tomek Matz) #4

Ja wiem o co Ci chodzi. Ale, czy możesz podać jakiś przykład zastosowania, bo nie spotkałem się z takim czymś. Jakieś dwie konkretne klasy (a nie A i B), gdzie takie wzajemne zagnieżdżenie będzie miało sens.


(Kamiljano) #5
  1. klasa rzeczownik i klasa czasownik. Rzeczownik wykonuje czynność na innym rzeczowniku: rzeczownik zawiera wskaźnik na czasownik, który zawiera wskaźnik na rzeczownik

  2. Mapa: miasto i drogi: każde miasto zawiera N dróg prowadzących do innych miast, zaś każda droga wskazuje 2 miasta.

Jeśli chcę stworzyć wydajnie działające algorytmy do tych klas, to to owszem będzie miało sens, jeśli tam nawpieprzam trochę tych wskaźnikow.

Potrzebuję więc coś na krztałt listy dwukierunkowej, z tą drobną różnicą, że kolejne elementy są różnych typów.


(Tomek Matz) #6

Jednak nie do końca Cię zrozumiałem, bo nie sądziłem, że chcesz wykonywać zagnieżdżenie kolekcji obiektów. Myślałem, że chodzi o pojedynczy obiekt jednej klasy w drugiej. Z kolekcją oczywiście się spotkałem, chociażby w strukturze drzewiastej. Przykład z mojej strony w klasie Pracownik zagnieżdżona jest klasa Zespół, a klasa Zespół to kolekcja klasy Pracownik.

Pierwszego przykładu nie ogarniam, więc go sobie odpuśćmy. J. polski nigdy nie był moją mocną stroną, więc nawet nie chce mi się zagłębiać w to co napisałeś. Jeśli chodzi o drugi przykład to jak najbardziej do mnie przemawia. Jedyne co mi się tutaj nie podoba to to, że każda z instancji klasy Droga z kolekcji tej klasy umieszczonej w obiekcie klasy Miasto, będzie zawierać referencję wskazującą na ten dany obiekt klasy Miasto. No ale biorąc pod uwagę, że to graf to chyba można na to przymknąć oko (choć nie mam pewności).


(Fiołek) #7

@ milka89 : takie zawieranie jest możliwe tylko przez wskaźniki(i deklaracje wsteczne), nie same obiekty. Przykład:

A.h:

struct B;

struct A

{

B* Obj;

A();

};

A.cpp:

#include "A.h"

#include "B.h"

A::A()

{

Obj = new B();

}

B.h:

struct A;

struct B

{

A* Obj;

B();

};

B.cpp:

#include "A.h"

#include "B.h"

B::B()

{

Obj = new A();

}

(Kamiljano) #8

takie rozwiązanie mi się wykrzacza jak już same includy wrzucam.


(Sawyer47) #9

Podaj komunikaty błędów.


([alex]) #10

Nie koniecznie, patrz bez wskaźników:

#include using namespace std;