• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

powiązanie między 2 klasami

Object Storage Arubacloud
0 głosów
142 wizyt
pytanie zadane 4 sierpnia 2018 w C i C++ przez jugan Nowicjusz (240 p.)
Witam, problem dotyczy c++ , a dokładniej obiektowości

Przypuśćmy, że chciałbym korzystać z 2 klas A , B . W klasie A chciałbym mieć obiekt klasy B, zaś w klasie  B chciałbym mieć obiekt klasy A. Czy da się coś takiego zrobić? Jeżeli dam jedynie deklarację zapowiadającą klasę to i tak kompilator słusznie zauważa, że "field ‘zmienna’ has incomplete type ‘B’.

 

Pozdrawiam

2 odpowiedzi

+1 głos
odpowiedź 4 sierpnia 2018 przez RafalS VIP (122,820 p.)
Jeśli pytasz o funkcjonalność to użyj wskaźnika lub referencji. Do zadeklarowania ich nie potrzebna jest pełna definicja typu, bo mają one zawsze ten sam rozmiar.

Jeśli o smaczki języka to wydaje mi się, że tego nie da się zrobić :P
komentarz 4 sierpnia 2018 przez jugan Nowicjusz (240 p.)
Trochę poogoglowałem i jedynie wskaźniki. Dziękuję za pomoc ;)
0 głosów
odpowiedź 4 sierpnia 2018 przez jugan Nowicjusz (240 p.)
edycja 4 sierpnia 2018 przez jugan

Nasunęło mi się takie pytanie do tego kodu:

#include <iostream>

using namespace std;
class B;
class A;

class A
{
        public:
        B *p;

        int a;
        public:
        int funa();
};
class B
{
        public:
        int b;
        A x;
        public:
        int funb()
        {
                return 25;
        }
};
int A::funa()
{
        cout<<p->funb()<<endl;
}

int main()
{
        A x;
        x.funa();
        x.p->b=5;
        cout<<x.p->b<<endl;
        return 0;
}
~                                                                                                                                   
~                      

Na co wskazuje wskaźnik p? Wiem, że to wskaźnik wskazujący na obiekt klasy B, ale aktualnie nie ma w sobie żadnego adresu takiego obiektu. Tworzę go, czyli de facto nie wskazuje na nic, ale mogę za jego pomocą używać metod z klasy do której należy. Działa też x.p->b , pomimo, że ten wskaźnik nie wskazuje na żaden obiekt. Żadnego obiektu klasy B nawet nie stworzyłem.

komentarz 4 sierpnia 2018 przez RafalS VIP (122,820 p.)
Powinieneś zadać osobne pytanie, bo tutaj nikt go może nie zauważyć.

Standard mówi, że przy takim wywołaniu jest undefined behaviour, czyli może się stać cokolwiek. Np może wszystko zadziałać, a może się też wywalić np z taką wiadomością "memory access violation exception".

Obstawiam, że wszystko zależy od kompilatora. Jeden od razu zaprotestuje inny nie.
komentarz 4 sierpnia 2018 przez j23 Mędrzec (194,920 p.)

Działa też x.p->b , pomimo, że ten wskaźnik nie wskazuje na żaden obiekt.

Na jakim systemie to kompilujesz i uruchamiasz?

komentarz 4 sierpnia 2018 przez jugan Nowicjusz (240 p.)
Fedora 25, g++
komentarz 4 sierpnia 2018 przez j23 Mędrzec (194,920 p.)

I twierdzisz, że linia x.p->b = 5; wykonuje się bez błędów, pomimo że p nie wskazuje na konkretny obiekt? Jeśli tak, to trochę to dziwne, nawet przy założeniu, że p == nullptr (świeży stos), powinieneś dostać błąd dostępu do pamięci.

komentarz 4 sierpnia 2018 przez jugan Nowicjusz (240 p.)
Tak się dzieje.

Też jest to dla mnie dziwne, zważywszy na to, że teoretycznie to nie powinno działać.
komentarz 4 sierpnia 2018 przez j23 Mędrzec (194,920 p.)

Niewykluczone, że optymalizacja tutaj zadziałała. Kompilator uznał, że kod można zredukować do cout << 5 << endl;

Podobne pytania

0 głosów
2 odpowiedzi 134 wizyt
0 głosów
1 odpowiedź 230 wizyt
pytanie zadane 17 marca 2019 w C i C++ przez MrChick888 Obywatel (1,020 p.)
0 głosów
2 odpowiedzi 125 wizyt
pytanie zadane 8 marca 2019 w C i C++ przez Mateusz Pawlak Użytkownik (960 p.)

92,566 zapytań

141,420 odpowiedzi

319,613 komentarzy

61,952 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...