niejasności odnośnie dynamicznej alokacji pamięci
Ostatnio zmodyfikowano 2009-04-07 22:51
gorgh Temat założony przez niniejszego użytkownika |
niejasności odnośnie dynamicznej alokacji pamięci » 2009-04-07 20:55:31 co wlasciwie oznacza kod: class klasa { innaklasa * wsk; public: klasa() { wsk = new innaklasa[ 10 ]; } void kopiuj( innaklasa & x ) { for( int r = 0; r < 10; r++ ) wsk[ r ] = x.wsk[ r ]; } }; Chodzi mi o to co wlasciwie podlega kopiowaniu w operacji wsk[g]=x.wsk[g] bo wydaje mi sie ,ze raczej nie caly objekt.dzieki za pomoc |
|
gorgh Temat założony przez niniejszego użytkownika |
<<do usunięcia>> » 2009-04-07 20:58:15 <<do usunięcia>> |
|
DeBugger |
» 2009-04-07 21:12:23 Hmm. Dynamiczna alokacja polega na tym, że inicjujesz w dowolnym momencie i w dowolnym niszczysz. Jest to po prostu taki wskaźnik. Dynamiczna zmienna może być używana w obiekcie. To tak jak z życiem - nie żyjemy od początku świata do końca, lecz w pewnej chwilii czasowej.
Kopiowaniu podlega dynamiczna tablica w klasie, mamy referencję do innej klasy(dlaczego nie tej samej klasy, tylko innej?!?), w której przy użyciu for ustawiamy wartości w tablicy. |
|
gorgh Temat założony przez niniejszego użytkownika |
.. » 2009-04-07 21:23:32 czy kopiowanie wartosci tablicy oznacza,ze kopiowane sa tez np. wartosci zmiennych kolejnych objektow z atrybutem 'private'? drugie pytanko: czemu skoro dynamicznie alokuje sie tablice objektow przy pomocy wskaznika to pozniej odwolujemy sie do metod danego objektu w tablicy jak za pomoca referencji,bez strzalki: wsk[3].pokaz(); |
|
DeBugger |
» 2009-04-07 21:37:55 1. Nie chce mi się sprawdzać, ale chyba będzie wywalało błąd, jeżeli będziemy chcemy użyć private, tym bardziej powinno wywalić w przypadku tego, że klasy są całkiem inne. 2. Szczerze mówiąc to... Nie wiem. Zawsze używałem jednego dynamicznego obiektu, tzn.: klasa * zmienna = new klasa() //edit: #include <iostream> using namespace std; class klasa { int liczba; public: void zmien( int wartosc ) { liczba = wartosc; } int zwroc() { return liczba; } }; int main() { klasa * zmienna = new klasa[ 5 ](); zmienna[ 0 ].zmien( 20 ); zmienna[ 1 ].zmien( 30 ); zmienna[ 2 ].zmien( 40 ); zmienna[ 3 ].zmien( 50 ); zmienna[ 4 ].zmien( 60 ); cout << zmienna[ 0 ].zwroc() << " " << zmienna[ 1 ].zwroc() << " " << zmienna[ 2 ].zwroc() << " " << zmienna[ 3 ].zwroc() << " " << zmienna[ 4 ].zwroc() << endl; zmienna->zmien( 80 ); cout << zmienna[ 0 ].zwroc() << " " << zmienna[ 1 ].zwroc() << " " << zmienna[ 2 ].zwroc() << " " << zmienna[ 3 ].zwroc() << " " << zmienna[ 4 ].zwroc() << endl; delete[] zmienna; } |
|
Aithne |
» 2009-04-07 21:55:56 2. Bo foo[69] to dla wskaźników po prostu cukierek składniowy zastępujący *(foo + 69). |
|
gorgh Temat założony przez niniejszego użytkownika |
» 2009-04-07 22:19:52 odnośnie punktu 1. bo jeszcze nie kumam: czy kopiując jedną tablicę obiektów do drugiej przenosimy "żywcem" obiekty z ich "bebechami" tj.wszystkie pola jak np. jakieś współrzędne punktów są automatycznie przepisywane i nie trzeba już tego robić "ręcznie"? |
|
DejaVu |
» 2009-04-07 22:36:24 int * dane = NULL; cout << sizeof( dane ) << endl; int * dane = new int[ 123 ]; cout << sizeof( dane ) << endl; int * nowy_wskaznik = NULL; nowy_wskaznik = dane; nowy_wskaznik[ 10 ] = 15; delete[] dane; nowy_wskaznik[ 10 ] = 5;
Jeśli chcesz przekopiować dane, musisz utworzyć drugą tablicę (możesz również zrobić to dynamicznie), a następnie np. pętlą for przekopiować element po elemencie z tablicy A do tablicy B. |
|
« 1 » 2 |