Autor Wątek: [C++]Szablon: Klasy zagnieżdżone  (Przeczytany 2908 razy)

Offline takeshi2318

  • Użytkownik

# Kwiecień 27, 2012, 11:14:47
Moje pytanie polega na tym, w jaki sposób klasie Y dać dostęp do elementu klasy X jakim jest mapa.
Myślałem o tym aby dać ją statyczną ale pojawiły się problemy więc chciałem na chama wyrzucić ją z klasy jako globalną ale niestety nie znam się zbyt dobrze na szablonach i nie wiedziałem jak zadeklarować klasę Index.
Z góry dzięki za pomysły.



template <class V, unsigned D>
class X
{
     public:
          class Index;
          map<Index,V> mapa;
          class Y
         {
                map<Index,V> bla(){return mapa;}
         }
}

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline koirat

  • Użytkownik

  • +1
# Kwiecień 27, 2012, 11:32:49
A nie możesz dać konstruktora dla klasy Y z parametrem będącym instancją klasy X ?

Offline Zielony

  • Użytkownik
    • Ghurund Engine

# Kwiecień 27, 2012, 12:23:29
Zagnieżdżone klasy w C++ są bardzo ograniczone. Ja raczej spróbowałbym rozwiązać problem w prostszy sposób. Tu masz konkretniej o zagnieżdżaniu klas w C++: http://msdn.microsoft.com/en-us/library/x23h0937(v=vs.80).aspx

Offline hashedone

  • Użytkownik

# Kwiecień 27, 2012, 12:55:07
Klasy zagnieżdżone w C++ to zupełnie co innego, niż klasy zagnieżdżone w Javie. W Javie obiekty klasy zagnieżdżonej są zależne od obiektu klasy nadrzędnej - przechowują jego referencje niejawnie. Z tego choćby powodu, nie można stworzyć obiektu klasy zagnieżdżonej bez obiektu klasy nadrzędnej. W C++ klasa nadrzędna jest tylko zakresem dla klasy zagnieżdżonej. Jeśli chcesz uzyskać podobne zachowanie do Javy, gdzie klasa zagnieżdżona zależy od klasy nadrzędnej, najlepiej przenieś odpowiedzialność tworzenia klasy podrzędnej na klasę bazową, np tak:
template <class V, unsigned D>
class X
{
     public:
          class Index;
          map<Index,V> mapa;
          class Y
         {
                X & owner;
                map<Index,V> bla(){return owner.mapa;}
                Y(X & x): owner(x) { }
                friend class X<V,D>;
         };
         Y CreateYRef() { return Y(*this); }
         Y * CreateY() { return new Y(*this); }
};
Oczywiście konstruktor w takim przypadku jest prywatny (klasa nadrzędna może go wywołać ze względu na przyjaźń), ale już konstruktor kopiujący musi być publiczny (chyba że nie potrzebujesz CreateYRef)
« Ostatnia zmiana: Kwiecień 27, 2012, 13:02:35 wysłana przez hashedone »

Offline Kos

  • Użytkownik
    • kos.gd

# Kwiecień 27, 2012, 12:58:10
Jak już robimy paralele, to powiedzieć można, że klasy zagnieżdżone w C++ to mniej więcej klasy zagnieżdżone statycznie z Javy.

Offline Haxy.M

  • Użytkownik

# Kwiecień 27, 2012, 13:04:15
Zasadnioczo użycie szablonów niewiele tu zmienia i tak jak było powiedziane wcześniej dobrzeby było gdyby klasa Y wiedziała kto jest jej właścicielem (czy to przez referencję czy przez wskaźnik do tegożże), a zatem do kogo ma biedz po mapę. Mapa mogłaby być statyczna, gdyby była jedna na wszystkie obiekty X<V,D>.

Offline takeshi2318

  • Użytkownik

# Kwiecień 27, 2012, 15:33:09
@hashedone
Twoje rozwiązanie jest całkiem fajne. Sam myślałem żeby class'a Y zawierała wyznacznik na map<Index,V>
i przekazywać go w konstruktorze. Bo zapomniałem napisać że klasa X posiada metodę zwracającą Y metodę  Y blabla(Index&). I po prostu w klasie Y zrobić konstruktor który by przyjmował referencje do mapy i element Index, aby potem łatwiej wyszukiwać element klasy V.

Offline koirat

  • Użytkownik

# Kwiecień 27, 2012, 23:02:28
Najlepiej to się zastanów po co chcesz te klasy w ten sposób ulokować, bo sens to pewnie ma niewielki.

Offline Bloodian

  • Użytkownik

# Kwiecień 28, 2012, 13:05:26
Witam kolege ze studiow.
W tym zadaniu klasa Y nie musi wiedziec o klasie X zeby dzialac poprawnie.
Wlasnie o to chodzi.


majac klase kontener
mamy klasy zagniezdzone iterator, index, ktore po prostu przechowuja adresy do odpowiednich danych mapy klasy X.