Strona 1 z 1

[C++] Wskaźnik na obiekt, czy dziedziczenie

: 31 maja 2014, 19:30
autor: TheMediator95
Witam wszystkich zebranych! Nie przedłużając, przejdę do kodu:

Kod: Zaznacz cały

// DOSTĘP DO ZMIENNEJ "a" POPRZERZ DZIEDZICZENIE Z KLASY "A"
class A
{
      int a;
};

class B : public A
{
      int b;
};

Kod: Zaznacz cały

// DOSTĘP DO ZMIENNEJ "a" POPRZEZ WSKAŹNIK DO OBIEKTU TYPU "A"
class A
{
      int a;
};

class B
{
      A* _a;
      int b;

public:
B()
{
      _a = new A;
}

~B()
{
      delete _a;
}

};
Pytanie jest następujące, kiedy stosować dziedziczenie, a kiedy te rozwiązanie ze wskaźnikami?

Re: [C++] Wskaźnik na obiekt, czy dziedziczenie

: 31 maja 2014, 19:42
autor: PisarzKsiazkowicz
Dziedziczenie stosujesz, gdy chcesz zrobić nową klasę na bazie poprzedniej.
Wskaźniki stosujesz, gdy chcesz stworzyć obiekt klasy A wewnątrz obiektu klasy B.

Przykład, Lightbulb.
Stosuję dziedziczenie by zrobić klasę RosterListModel na bazie ListModel. W ten sposób mogę też zrobić inne takie bajery na bazie ListModel, w którym mam wspólne cechy dla wszystkich tych klas. W klasie MyXmppClient mam sobie wskaźnik do RosterListModel, dzięki czemu mogę sobie stworzyć i zarządzać listą kontaktów w tej klasie.

Z całym szacunkiem, ale takie przykłady omawiane na lekcjach są fallusowe.

Re: [C++] Wskaźnik na obiekt, czy dziedziczenie

: 31 maja 2014, 23:24
autor: TheMediator95
Czyli jak na razie nie powiedziałeś mi niczego czego bym jeszcze nie wiedział. Zobacz, na dobrą sprawę gdyby MyXmppClient dziedziczyłaby po RosterListModel to też "mogę sobie zarządzać listą kontaktów w tej klasie (RosterListModel )." Dlatego pytam się kiedy stosuje się jedno rozwiązanie, a kiedy drugie, które jest szybsze itd.
PisarzKsiazkowicz pisze:Z całym szacunkiem, ale takie przykłady omawiane na lekcjach są fallusowe.
Jakich lekcjach? :P

Re: [C++] Wskaźnik na obiekt, czy dziedziczenie

: 01 cze 2014, 9:20
autor: PisarzKsiazkowicz
A widzisz, bo nie. Co jeśli chciałbym mieć kilka modeli w tej klasie? Dziedziczenie powoduje, że mam wszystkie funkcje i obiekty danej klasy w nowej, gdy przy wskaźniku robisz nowy obiekt wewnątrz swojej klasy.

Nie ma jednoznacznej odpowiedzi lepsze/gorsze, tak jak z rodzajami pętli. Po prostu stosuje się to w różnych sytuacjach.

Re: [C++] Wskaźnik na obiekt, czy dziedziczenie

: 01 cze 2014, 17:17
autor: TheMediator95
PisarzKsiazkowicz pisze: Co jeśli chciałbym mieć kilka modeli w tej klasie?
W C++ klasa pochodna może mieć więcej niż jedną klasę bazową, tak więc bez problemu jeśli klasa MyXmppClient dziedziczyłaby po kolejnym "modelu", to efekt byłby taki sam jak przy użyciu wskaźnika. Więc jeśli chodzi o widoczność elementów składowych klas to nie ma znaczenia którego sposobu się użyje.
Wydaje mi się że jest to kwestia dobrej reprezentacji rzeczywistości w programach. Na przykład klasa Ubiór nie powinna być klasą bazową dla człowieka, ponieważ człowiek wcale nie musi być ubrany. W przypadku kiedy człowiek nie jest ubrany przy dziedziczeniu marnuje się pamięć zarezerwowaną dla ubioru którego nie ma. Tak samo z klasą Ubiór, może zawierać obiekty innych klas takich jak: Buty, Spodnie, Czapki itd., wydaje się lepszy w tej sytuacji wskaźnik bo nie mogę założyć że każdy będzie nosił na przykład czapkę.
Dziedziczenie zakłada iż coś na pewno istnieje, natomiast tworzenie wskaźnika na własny typ wewnątrz nowego typu, zakłada że coś może istnieć lub nie. Ja właśnie tak odbieram to rozwiązanie, chociaż mogę się mylić, dlatego tutaj napisałem. Tak więc Pisarzu, co o tym myślisz?
Wydaje mi się że metoda wskaźnikowa jest wolniejsza podczas tworzenia obiektu, natomiast szybsza podczas odczytu i zapisu danych na utworzonym obiekcie.

Re: [C++] Wskaźnik na obiekt, czy dziedziczenie

: 01 cze 2014, 17:24
autor: bsystem
Mediator95 - człowiek, który prosi o radę a potem sam się wymądrza na temat w kwestii którego prosił.

Re: [C++] Wskaźnik na obiekt, czy dziedziczenie

: 01 cze 2014, 17:29
autor: lolasher
Mediator, a zasadnicza różnica nie polega na dziedziczeniu konstruktorów i takich tam?

Re: [C++] Wskaźnik na obiekt, czy dziedziczenie

: 01 cze 2014, 18:39
autor: PisarzKsiazkowicz
TheMediator95 pisze:W C++ klasa pochodna może mieć więcej niż jedną klasę bazową, tak więc bez problemu jeśli klasa MyXmppClient dziedziczyłaby po kolejnym "modelu", to efekt byłby taki sam jak przy użyciu wskaźnika. Więc jeśli chodzi o widoczność elementów składowych klas to nie ma znaczenia którego sposobu się użyje.
Lol nope.

Patrz.
Mam sobie klasę MyXmppClient, w której załóżmy, że jest RosterListModel i ChatsListModel.
Obie zawierają podobne funkcje i pododne dane, ale ChatsListModel zawiera dane dotyczące otwartych rozmów, zaś RosterListModel zawiera całą listę kontaktów. Jeśli użyłbym dziedziczenia, nie byłbym w stanie przechowywać obu osobnych list, you know?

Ale za to mogę zrobić na luzie wskaźnik roster i wskaźnik chats. :> Teraz mogę zrobić Q_PROPERTY, dzięki czemu będę mógł pobrać jedną listę po prostu w sposób xmppClient.roster i xmppClient.chats. Tego też nie mógłbym za bardzo zrobić korzystając z dziedziczenia.

bsystem() { this->approve(); }

lolasher, właśnie w tym rzecz. W momencie, gdy dziedziczysz, tworzysz klasę która opiera się na innej klasie, ma te same funkcje i wartości itd.

Jak już mówiłem, jeśli potrafisz kodzić, wiesz kiedy jedno ma sens, a kiedy drugie. To są dwie odrębne rzeczy i chociaż idealnie wpasowują się w Twój durny przykładzik, to w prawdziwym życiu nie ma tak łatwo.