Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

c++ Dostęp do kontenera z zewnątrz (klasy go zawierającej) i brak pewnych składowych

#1
c++ Dostęp do kontenera z zewnątrz (klasy go zawierającej) i brak pewnych składowych
Otóż mam kontener opakowany w pewnej klasie służącej do zarządzania obiektami. (kontener typu mapa). Typem obiektów, które umieszczam w kontenerze są obiekty klas dziedziczących z ogólnej klasy bazowej (class Obiekt). Jeśli chcę użyć jakiejś zmiennej dodanej w klasie pochodnej wewnątrz obiektu dodanego do kontenera wszystko działa jednak kiedy chcę użyć go z poziomu innej klasy kompilator wywala błąd o braku takiej składowej w klasie Obiekt. Da się jakoś to ominąć?

Kod:
//Header
class Obiekt
{
public:
Obiekt(jakisparametr);
virtual jakasFunkcja();
int JakasZmienna;
};

class Pochodna:public Obiekt
{
Pochodna(jakisparametr);
int JakasInnaZmienna;
};

class Manager
{
map<typ> Obiekty;
void JakasFunkcja();
};

// cpp
Pochodna::Pochodna(jakisparametr):Obiekt(jakisparametr){
//przypisanie wartosci

}

Sorka jeśli wyraziłem się nie zbyt jasno.

Wszelkie operacje z zewnątrz na obiekcie z kontenera odwołują się do Obiektu bazowego (nie utworzonego).
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#2
RE: c++ Dostęp do kontenera z zewnątrz (klasy go zawierającej) i brak pewnych składowych
Mechanizm dziedziczenia i funkcji wirtualnych nie mówi, że:
Kod:
class A {
  public:
    A() { };
    int a;
};

class B : public A {
  public:
    B() { };
    int b;
};

A* ob = new B;
ob.b; // nie
}
ob jest typu A, więc w sobie nie ma b. Poczytaj o object slicing. Rozwiązanie... hmm... coś jak refleksje w Javie. Być może nie do końca poprawnie używasz w swoim kodzie relacji dziedziczenia i stąd taka ochota. W każdym razie nie bardzo. Można to jakoś hakować, np. trzymać takie inty na liście i mieć metodę, która zwraca listę tych intów...ale to hakowanie jest.

EDIT:
Okłamałem trochę. Można to zrobić lepiej. Najpierw jednak powiedz mi, skąd masz pewność, że obiekt, który wyciągasz z kontenera trzymającego obiekty klasy bazowej jest obiektem klasy pochodnej? (Podaj przykład odzwierciedlający to co robisz i skąd pewność o typie obiektu)

Są dwa rozwiązania: rzutowanie lub realizacja wzorca projektowego visitor.
Pierwszy z nich, to nic innego jak
Kod:
dynamic_cast<B> obj_A
W przypadku gdy rzutowanie nie może być wykonane rzucany jest wyjątek bad_cast.
O drugim możesz poczytać sporo w sieci. Krótko, idea jest taka, że klasa bazowa implementuje akcesory(geter i/lub seter) do elementu podklasy jako funkcje wirtualne. Ponieważ sama nie ma tych składowych, więc jedyną sensowną rzeczą, która metoda może zrobić jest rzucenie wyjątku. Natomiast w podklasie B po prostu implementujesz geter. Wówczas możesz zawsze wywołać na obiekcie klasy A geter, a mechanizm funkcji wirtualnych sam dopasuje odpowiednią metodę do wywołania. Oczywiście musisz liczyć się z wyjątkiem rzucanym przez metodę z klasy A.

Druga wersja moim zdaniem jest bardziej elastyczna. Zależy jednak od konkretnych zastosowań.
 System operacyjny: linux Przeglądarka: firefox
#3
RE: c++ Dostęp do kontenera z zewnątrz (klasy go zawierającej) i brak pewnych składowych
Dzięki za pomoc, przeniosłem tylko składowe do klasy bazowej i nie co zmieniłem swoją hierarchie dziedziczenia.
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
Programy: Polecane / Nowe / Inne




Podobne wątki (c++ Dostęp do kontenera z zewnątrz (klasy go zawierającej) i brak pewnych składowych)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  [Java] ConflictingBeanDefinitionException - dwie klasy o tej samej nazwie Mordrak 4 6802 12.10.2016, 21:24
Ostatni post: Mordrak
  C++ czy da się przez szablon funkcji przesłać obiekt klasy i go policzyć Mordrak 1 6153 02.06.2015, 10:27
Ostatni post: Szachista
  [C++] Klasy - prośba o pomoc w wykonaniu zadań Darowin 1 3588 07.09.2014, 15:23
Ostatni post: Szachista

Skocz do:


Wybrane wątki (c++ Dostęp do kontenera z zewnątrz (klasy go zawierającej) i brak pewnych składowych)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  VBA excel dmjs 6 5256 17.04.2019 10:20
Ostatni post: ptrick
  C++ - sens pogłębiania nauki gbr 5 5735 25.03.2019 12:53
Ostatni post: koneton
  Klasa wewnętrzna w C++ Physicist 4 5539 23.03.2019 18:28
Ostatni post: Physicist
  Ruby on Rails - tutoriale luciussulla 0 4840 23.03.2019 16:49
Ostatni post: luciussulla
Big Grin Czy dostane sie technikum informatycznego klaudiusz20046 6 7650 21.03.2019 01:28
Ostatni post: UnableToSee
  [C#] Program do moderacji czatów gier wiktrom12 0 5356 07.03.2019 15:33
Ostatni post: wiktrom12
  Mój pierwszy projekt - Pomoc rafal12999 1 5878 07.02.2019 22:01
Ostatni post: Szachista
  pomoc projekt scilab piesel18 2 7136 04.02.2019 09:03
Ostatni post: piesel18
  Szkoła Informatyczna Zikinan 1 6233 02.02.2019 17:59
Ostatni post: wojownikhaha
  [Java] Strona z zadaniami do rozwiązania i odpowiedziami rafal12999 2 6986 27.01.2019 13:44
Ostatni post: rafal12999
  kompilacja biblioteki Agui - cmake jurek2 0 6280 10.01.2019 13:12
Ostatni post: jurek2
  Zamiana całego zestawu znaków wg przyporządkowania BarHorab 5 6947 19.12.2018 16:45
Ostatni post: Szachista
  Sumowanie licz excel - problem OxyGenE 2 9837 19.12.2018 16:29
Ostatni post: Szachista
  Jaki kod pod pewne zdarzenia visualbasic 2010 aktywny27 4 7525 07.11.2018 13:41
Ostatni post: Ajgor
Scared Ipad Pro programowanie? NissmoOne 4 8242 06.10.2018 12:22
Ostatni post: NissmoOne