Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

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
Autor Wiadomość
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:
C/C++
namespace System
{
    namespace classA
    {
        class A
        {
        private:
           
            HWND win = NULL; //korzystam z WinAPI
            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:
C/C++
int main()
{
    System::classA::A a();
    System::classB::B b( & a );
    HWND win = NULL;
    win = b.jakasFunkcja();
    //Jakiś kod...
    //...
    //...
    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():
C/C++
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?
P-127284
Monika90
» 2015-02-23 22:04:36
Piewszy błąd jest tutaj
C/C++
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
C/C++
}

i tu
C/C++
friend class System::classA::A

i tu też
C/C++
}
brak średnika

A to w main
C/C++
System::classA::A a();
deklaruje funkcję, a nie zmienną typu System::classA::A
P-127288
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ę:
C/C++
class B
{
public:
    void linkToA( System::classA::A * a );
    //reszta kodu...
}
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).
P-127293
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:
C/C++
namespace System
{
    namespace classB
    {
        class B;
    }
    namespace classA
    {
        class A
        {
        private:
           
            HWND win = NULL; //korzystam z WinAPI
            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!
P-127409
« 1 »
  Strona 1 z 1