• 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
102 wizyt
pytanie zadane 3 dni temu w C i C++ przez użytkownika Nekronomik Początkujący (420 punkty)

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ź 3 dni temu przez użytkownika draghan Szeryf (83,170 punkty)

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ź 3 dni temu przez użytkownika koczurekk Gaduła (3,200 punkty)
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 3 dni temu przez użytkownika Szahid Stary wyjadacz (13,390 punkty)
Co rozumiesz przez surowe i dlaczego nie są dobre
1
komentarz 2 dni temu przez użytkownika draghan Szeryf (83,170 punkty)

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 2 dni temu przez użytkownika Criss Szeryf (93,400 punkty)
komentarz 2 dni temu przez użytkownika Szahid Stary wyjadacz (13,390 punkty)
Dzięki za odpowiedzi
0 głosów
odpowiedź 3 dni temu przez użytkownika Nekronomik Początkujący (420 punkty)
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 2 dni temu przez użytkownika Criss Szeryf (93,400 punkty)

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

AA *nowy = new AA;
bb.nowy_BB = reinterpret_cast<BB *>(nowy);
komentarz 2 dni temu przez użytkownika draghan Szeryf (83,170 punkty)
Ohyda.
komentarz 2 dni temu przez użytkownika Criss Szeryf (93,400 punkty)
Jasne, że tak :D Chciałem tylko zaznaczyć, że jak by co, to się da.
0 głosów
odpowiedź 2 dni temu przez użytkownika mokrowski Stary wyjadacz (10,320 punkty)
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 94 wizyt
pytanie zadane 4 września 2016 w C i C++ przez użytkownika pewien_programista Użytkownik (720 punkty)
0 głosów
2 odpowiedzi 57 wizyt
pytanie zadane 26 stycznia w C i C++ przez użytkownika qwertz Użytkownik (860 punkty)
0 głosów
1 odpowiedź 52 wizyt
pytanie zadane 4 października 2016 w C i C++ przez użytkownika Kuba321 Użytkownik (580 punkty)
...