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

Przypisanie adresu klasy AA do klasy BB

0 głosów
107 wizyt
pytanie zadane 20 marca 2017 w C i C++ przez Nekronomik Początkujący (420 p.)

Witam, mam taki oto kod napisany dla testów:

class AA
{
	public:
		AA *nowy_AA;
};

class BB
{
	public:
		BB *nowy_BB;
};
BB bb;

void testy()
{
	AA *nowy=new AA;
	bb.nowy_BB=nowy;
}

Po kompilacji wywala mi błąd dla "bb.nowy_BB=nowy;" [Error] cannot convert 'AA*' to 'BB*' in assignme

Czy jest jakiś sposób aby w bb.nowy_BB był zapisany adres obiektu "nowy".
Wiem że można użyć np. dziedziczenia czy nawet działać na klasach abstrakcyjnych ale nigdy nie mogłem rozwiązać tego problemu w tym przykładzie. Możliwe że jest to bardzo proste albo po prostu tak nie można robić.

4 odpowiedzi

+1 głos
odpowiedź 20 marca 2017 przez draghan Szeryf (97,430 p.)

Możliwe że jest to bardzo proste albo po prostu tak nie można robić.

Oczywiście że tak nie można robić. Obiekt klasy AA to nie jest obiekt klasy BB i całkiem słusznie zabronione jest przypisanie adresowe.

Możesz wykorzystać tutaj dziedziczenie i operować wskaźnikiem do klasy bazowej, ale to nie jest rozwiązanie do wszystkich zastosowań - innymi słowy: czym konkretnie mają być klasy AA i BB?

0 głosów
odpowiedź 20 marca 2017 przez koczurekk Gaduła (3,380 p.)
Wskaźnik jednego typu nie może wskazywać na coś zupełnie innego i nie powiązanego, bo coś takiego w ogóle nie ma sensu. Powiedz co chcesz osiągnąć, na pewno jest lepsze rozwiązanie Twojego problemu.

Zwłaszcza, że w C++ surowe wskaźniki od dawna nie są dobrym rozwiązaniem żadnego problemu.
komentarz 21 marca 2017 przez Szahid Pasjonat (18,070 p.)
Co rozumiesz przez surowe i dlaczego nie są dobre
1
komentarz 21 marca 2017 przez draghan Szeryf (97,430 p.)

Surowy wskaźnik to 'zwykły' wskaźnik:

Type *instance_handle;

Dlaczego są złe? Bo są przyczyną sporej klasy błędów. Głównie z powodu niejasności oznaczenia własności. Jeśli dostajesz skądś jakiś wskaźnik, to nie wiesz czy możesz i czy w ogóle powinieneś zwolnić pamięć mu przydzieloną. Ponadto surowe wskaźniki nie gwarantują zwolnienia zajętej pamięci w przypadku opuszczenia zakresu (czy to przez wyjątek czy przez zwykłe return).

Co zamiast surowych wskaźników? Albo nie bawić się wskaźnikami, albo stosować wskaźniki inteligentne (np. z biblioteki standardowej), albo w ostateczności chociaż oznaczać wskaźniki-właścicieli jako owner<T*> (szukaj: guideline support library).

1
komentarz 21 marca 2017 przez Criss VIP (129,650 p.)
komentarz 21 marca 2017 przez Szahid Pasjonat (18,070 p.)
Dzięki za odpowiedzi
0 głosów
odpowiedź 20 marca 2017 przez Nekronomik Początkujący (420 p.)
Tak własnie myślałem że się nie da...
Dzięki za szybką odpowiedź.
Ogólnie chciałem to wykorzystać do czegoś czego nie do końca rozumiem.
Dokładnie chciałem wykorzystać adresy obiektów z listy dwukierunkowej w drzewie czwórkowym bo lista jak i drzewo czwórkowe to u mnie dwie osobne klasy.
komentarz 21 marca 2017 przez Criss VIP (129,650 p.)

W zasadzie, to się da, ale sensu to za bardzo nie ma.

AA *nowy = new AA;
bb.nowy_BB = reinterpret_cast<BB *>(nowy);
komentarz 21 marca 2017 przez draghan Szeryf (97,430 p.)
Ohyda.
komentarz 21 marca 2017 przez Criss VIP (129,650 p.)
Jasne, że tak :D Chciałem tylko zaznaczyć, że jak by co, to się da.
0 głosów
odpowiedź 21 marca 2017 przez mokrowski Maniak (50,360 p.)
Wprowadź klasę interfejsu i ją zaimplementuj w AA i BB. Myślę że wystarczy Ci to do zbudowania uniwersalnego kontenera (vide inny wątek związany z drzewem czwórkowym).

Podobne pytania

0 głosów
2 odpowiedzi 106 wizyt
pytanie zadane 4 września 2016 w C i C++ przez pewien_programista Użytkownik (860 p.)
0 głosów
2 odpowiedzi 66 wizyt
0 głosów
1 odpowiedź 62 wizyt
pytanie zadane 4 października 2016 w C i C++ przez Kuba321 Użytkownik (630 p.)
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.
Ciekawy innych porad? Odwiedź tę stronę!

45,699 zapytań

86,090 odpowiedzi

171,933 komentarzy

22,166 pasjonatów

Przeglądających: 168
Pasjonatów: 7 Gości: 161

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...