Dostęp w klasie B do prywatnych składowych zaprzyjaźnionej klasy A poprzez wskaźnik na nią
Ostatnio zmodyfikowano 2015-02-26 16:23
TheReclif Temat założony przez niniejszego użytkownika |
Dostęp w klasie B do prywatnych składowych zaprzyjaźnionej klasy A poprzez wskaźnik na nią » 2015-02-23 21:08:17 Witam! Może i tytuł jest długaśny, ale prawie idealnie przekazuje z czym mam problem. Założenie: klasa A, która jest w namespace-ie classA i posiada parę ważnych do działania programu składowych(są one prywatne) oraz klasa B w namespace-ie classB ze wskaźnikiem na pewien obiekt klasy A. Klasa A jest zaprzyjaźniona z klasą B i vice versa. Obie klasy są w namespace-ie System. Kod prezentuje się tak: namespace System { namespace classA { class A { private: HWND win = NULL; friend class System::classB::B; public: A() { }; ~A() { }; } } namespace classB { class B { private: classA::A * klasaA = NULL; friend class System::classA::A public : B( System::classA::A * a ) { klasaA = a; }; ~B() { }; HWND jakasFunkcja() { return klasaA->win; }; } } }
Czas na wykorzystanie metody jakasFunkcja() w praktyce: int main() { System::classA::A a(); System::classB::B b( & a ); HWND win = NULL; win = b.jakasFunkcja(); return 0; }
Tu pojawia się problem. Korzystam z Visual Studio 2013 Community, który wykrywa błędy jeszcze przed kompilacją BĄDŹ podczas pisania plików nagłówkowych. Po prostu zawsze. I wykrywa błąd w linijce z deklaracją i implementacją metody jakasFunkcja(): HWND jakasFunkcja() { return klasaA->win; };
Błąd: Error: member "System::classA::a::win" is inaccessible
Wujek Google nie daje mi rozwiązania. Co robię źle? |
|
Monika90 |
» 2015-02-23 22:04:36 Piewszy błąd jest tutaj friend class System::classB::B;
w tym miejscu classB::B nie jest jeszcze znane kompilatorowi, więc nie można zaprzyjaźnić. następnie tu i tu friend class System::classA::A
i tu też brak średnika A to w main deklaruje funkcję, a nie zmienną typu System::classA::A |
|
TheReclif Temat założony przez niniejszego użytkownika |
» 2015-02-23 22:35:51 Zmodyfikowałem kod i jakoś działało. Do chwili. Stworzyłem teraz do linkowania oddzielną metodę: class B { public: void linkToA( System::classA::A * a ); } void B::linkToA( System::classA::A * a ) { klasaA = a; }
Kolejny błąd: declaration is incompatible with "void System::classB::B::linkToA(<error-type> *a)"
Już nie jestem pewien, czy jest możliwe napisanie tego w taki sposób, aby działało tak, jak założyłem(ale pewnie jest to możliwe). |
|
TheReclif Temat założony przez niniejszego użytkownika |
» 2015-02-26 16:23:31 Ok, już działa. Poszperałem trochę i natrafiłem na prototypy klas. Zmodyfikowałem kod i wyszło mniej więcej tak: namespace System { namespace classB { class B; } namespace classA { class A { private: HWND win = NULL; friend class System::classB::B; public: A() { }; ~A() { }; } } namespace classB { class B { private: classA::A * klasaA = NULL; friend class System::classA::A public : B( System::classA::A * a ) { klasaA = a; }; ~B() { }; HWND jakasFunkcja() { return klasaA->win; }; } } }
Mam nadzieję, że istnieją prototypy klas i sobie ich nie wymyśliłem. Temat do zamknięcia. Dzięki za pomoc! |
|
« 1 » |