widoczność klasy zewn. w klasie wewn.

0

Witam.

Mam klasę A, wewnątrz której siedzi klasa B:

class A
{

     class B
     {
           T1 f(T2);
     }
}

Chcę napiasć funkcję składową klasy B i odwołać się w tej funkcji do

class A
{
     public:
     T1 f1(T2);     

     class B
     {
           T3 f2(T4);
     };
};

Funkcję f2 wywołuje się na rzecz konkretnego obiektu. Funkcja f1 jest wywoływana również na rzecz konkretnego obiektu, natomiast w klasie B w funkcji f2 nie mam dostępu do wskaźnika "this" obiektu klasy A, lecz mam "this" do obiektu klasy B.

Jak odwołać się do funkcji f1 będąc w funkcji f2?
Dziękuję i pozdrawiam.

0

Nie bardzo rozumiem w czym problem. Na tym polega enkapsulacja że nie mozesz.
Jeśli funkcja f1() ma być wywoływana nie-na-rzecz obiektu, to niech będzie statyczna.
W innym przypadku obiekt musi być i już.

0

No dobrze, ale funkcja f1 jest publiczna, więc mam prawo się do niej odwoływać. Problem w tym, że nie mam do niej uchwytu.

Jeżeli mój program wykonuje funkcję f2, to oznacza to, że musi istnieć obiekt klasy B, na rzecz którego ta funkcja jest wykonywana. Natomiast jeśli istnieje obiekt klasy B, to oznacza to, że musi istnieć również obiekt klasy A, dzięki któremu obiekt klasy B zawdzięcza swoje istnienie. No i te dwa obiekty klasy A i klasy B są z sobą w jakiś sposób związane, bo drugi siedzi wewnątrz pierwszego.

Więc jeśli istnieje obiekt klasy B, to istnieje też obiekt klasy A, do którego nie mogę się dostać.

Niestety, mam takie ograniczenie, że funkcja f1() nie może być statyczna.

Więc nie ma żadnego ratunku? :|

0

Brak logiki.
To że istnieje obiekt klasy B NIE OZNACZA że istnieje też obiekt klasy A.
Bo wewnątrz funkcji z klasy A możesz się odwoływać do klasy B, i na przykład w metodach statycznych albo w konstruktorze tworzyć i niszczyć obiekty klasy B mimo ze obiekt klasy A nie istnieje.

Twój problem polega na złym zaprojektowaniu rozwiązania, a nie na tym że język na coś nie pozwala.

0

Ok. Zrozumiałem już swój błąd i rozwiązałem sprawę. Przed chwilą sprawdziłem to empirycznie, że mogę utworzyć obiekt klasy B nie tworząc obiektu klasy A. No i ominąłem problem w swoim programie, nie będę tłumaczył jak.

Dzięki Shalom. TEMAT ZAMKNIĘTY. Pozdrawiam.

0

Moge sie mylic, ale podejrzewam ze problem tkwi w tym, ze autor postu pisal wczesniej w Javie. W tym jezyku, kazdy obiekt klasy zagniezdzonej automatycznie pamieta, jaki obiekt klasy otaczajacej go utworzyl. Wrecz, niemozliwe jest utworzenie obiektu klasy zagniezdzonej 'oderwanej' od otaczajacej, nie otaczanej przez nic. Tak wiec, w Javie, kenijczyk nie mialby najmniejszego problemu z wywolaniem metody z klasy ponad-, jezyk rozstrzyga widzialnosc metod i domysla sie czy chodzi o moj this, czy o this otaczajacej, czy o this otaczajacej-otaczajaca, etc. Enkapsulacja przy tym nie jest zlamana. Enkapsulacja dotyczy dostepnosci pol - private, protected, etc - tak w C++ jak i w Javie, obiekt klasy zaniezdzonej ma dostep do zawartosci protected/private klasy otaczajacej. Tutaj podlozem problemu jest raczej to, ze w C++ okreslono taki model cyklu zycia obiektow a nie inny. C# ma takie samo podejscie jak C++, a Java ma wlasnie inne, zgodnie z pierwotna mysla kenijczyka!

Shalom - Uwazaj wiec z zarzuceniem braku logiki! Podejscie zastosowane w Javie nie jest pozbawione sensu!
kenijczyku - jesli dobrze zgadlem, pamietaj, żeby o swojej poprzedniej wiedzy uprzedzać

1 użytkowników online, w tym zalogowanych: 0, gości: 1