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

Java - tablica dla obiektów kalsy podstawowej zawierająca obiekty klasy pochodnej

Ostatnio zmodyfikowano 2017-08-01 20:21
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
Java - tablica dla obiektów kalsy podstawowej zawierająca obiekty klasy pochodnej
» 2017-08-01 03:07:18
Witam. W C++ nie możemy tablicy na obiekty klasy T przypisać obiektów klasy dziedziczącej po T. Znaczy jest to możliwe fizycznie, ale Jeśli obiekt T zajmuje 60 bajtów, a obiekt klasy dziedziczącej 80 bajtów, to przy odwołaniu się do pierwszego elementu nic się nie stanie, ale przy kolejnych program się wywali, bo wskaźnik będzie wskazywał element "oddalony" o 60 bajtów od pierwszego, a nie 80... w sumie, wiecie.

Teraz jak to jest z Javą? Tutaj możemy stosować coś takiego. Ale skąd ta tablica "wie" o ile bajtów powinna przesunąć... referencję? A w zasadzie ile "dodać" do adresu, który przechowuje. Mam nadzieję, że dobrze to objaśniłem.
P-163735
Monika90
» 2017-08-01 07:35:28
W Javie nie ma tablic obiektów, są tablice typów wbudowanych (int, float, itp) i są tablice referencji do obiektów (czyli tablice wskaźników). Ponieważ wszystkie referencje do obiektów zajmują tyle samo miejsca w pamięci, to nie ma problemu o który się martwisz.
P-163736
pekfos
» 2017-08-01 13:13:58
W C++ nie możemy tablicy na obiekty klasy T przypisać obiektów klasy dziedziczącej po T.
Możemy.

Ale skąd ta tablica "wie" o ile bajtów powinna przesunąć... referencję? A w zasadzie ile "dodać" do adresu, który przechowuje.
Po co tablica ma coś robić z przechowywaną referencją?
P-163741
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-08-01 13:17:37
Ahh no tak, referencje...
Ale w Javie nie ma chyba takiej inkrementacji tablic, jak w C++? Jak to tutaj wygląda?
C/C++
int * a = new int[ 5 ];
std::cout <<* a;
a += 2;
std::cout <<* a;

Natomiast w javie nie jest to możliwe. Dlaczego? Można byłoby zrobić coś takiego, szczególnie, że skoro rozmiary są stałe (bo to referencje) to wystarczy "przesuwać" referencję o 4 (lub 8) bajtów i wtedy taka referencja wskazuje na inną referencje...
C/C++
T tabl[] = new T[ 5 ];
T++; // referencja tabl jest przesuwana o 4 bajty i wskazuje na referencję tabl[1], a nie tabl[0]

Zastrzegam sobie prawo do popełnienia błędu w powyższych rozważaniach ;)

EDIT
@pekfos
W C++ nie możemy tablicy na obiekty klasy T przypisać obiektów klasy dziedziczącej po T.
Możemy.

W C++ nie możemy tablicy na obiekty klasy T przypisać obiektów klasy dziedziczącej po T. Znaczy jest to możliwe fizycznie, ale Jeśli obiekt T zajmuje 60 bajtów, a obiekt klasy dziedziczącej 80 bajtów, to przy odwołaniu się do pierwszego elementu nic się nie stanie, ale przy kolejnych program się wywali, bo wskaźnik będzie wskazywał element "oddalony" o 60 bajtów od pierwszego, a nie 80

Po co tablica ma coś robić z przechowywaną referencją?
Mam tu na myśli sytuacje, jaka występuje w C++. W c++ możemy wykonywać operacje arytmetyczne na wskaźniku. Jeśli ten wskaźnik jest dynamicznie zaalokowany i wskazuje na tablice (element 0), to po inkrementacji go będzie wskazywał na element 1. Chciałbym się dowiedzieć, dlaczego nie ma czegoś takiego w javie...
P-163742
pekfos
» 2017-08-01 13:45:15
W C++ nie możemy tablicy na obiekty klasy T przypisać obiektów klasy dziedziczącej po T. Znaczy jest to możliwe fizycznie, ale Jeśli obiekt T zajmuje 60 bajtów, a obiekt klasy dziedziczącej 80 bajtów, to przy odwołaniu się do pierwszego elementu nic się nie stanie, ale przy kolejnych program się wywali, bo wskaźnik będzie wskazywał element "oddalony" o 60 bajtów od pierwszego, a nie 80
Możemy. Bezpiecznie™.
P-163743
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-08-01 13:51:09
Cóż, może zostało to zmienione, ale w Symfonii Standard Grębosz pisze, że tak robić nie można.
Możesz więc jakoś uargumentować swoje zdanie?
P-163744
Monika90
» 2017-08-01 14:06:43
C/C++
Base a[ 5 ];
Derived x;
a[ 0 ] = x;
Tak można robić, ale a[0] wciąż jest typu Base, jest to tzw. slicing.

Być może tobie chodzi o to
C/C++
Derived a[ 5 ];
Base * p = a;
++p;
P-163745
latajacaryba
Temat założony przez niniejszego użytkownika
» 2017-08-01 15:26:18
@Monika90

Tak, o to mi chodziło. W książce był podany przykład:

C/C++
// K - klasa podstawowa, KK- Pochodna
void funk( K * );

int main()
{
    KK tablPoch[ 10 ];
   
    funk( tablPoch );
}

Czyli obcięcie następuje w przypadku przypisania obiektowi klasy podstawowej obiekt klasy pochodnej?
Przy wskaźniku i referencji jest konwersja i wskaźnik/referencja klasy podstawowej może wskazywać na obiekt klasy pochodnej.
A problem jest dopiero przy wskaźniku na tablicę.

Więc pozostaje pytanie, co z javą:
Jak rozumiem tablica w javie jest referencją, która wskazuje na inne referencje. Te inne referencje to komorki tablicy. jeśli to co napisałem jest prawdą, to dlaczego tej referencji nie możemy inkrementować, tak, jak wskaźnika na tablice w C++?
P-163747
« 1 » 2
  Strona 1 z 2 Następna strona