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

niejasności odnośnie dynamicznej alokacji pamięci

Ostatnio zmodyfikowano 2009-04-07 22:51
Autor Wiadomość
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:
C/C++
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
P-5368
gorgh
Temat założony przez niniejszego użytkownika
<<do usunięcia>>
» 2009-04-07 20:58:15
<<do usunięcia>>
P-5369
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.
P-5370
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();
P-5371
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:
C/C++
#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 );
    //zmienna[0]->zmien(35); - błąd - base operand of ‘->’ has non-pointer type ‘klasa’
    cout << zmienna[ 0 ].zwroc() << " " << zmienna[ 1 ].zwroc() << " " << zmienna[ 2 ].zwroc() << " " << zmienna[ 3 ].zwroc() << " " << zmienna[ 4 ].zwroc() << endl;
    zmienna->zmien( 80 ); //wygląda na to, że przypisujemy wartość pierwszemu elementowi, bez wymieniania go
    cout << zmienna[ 0 ].zwroc() << " " << zmienna[ 1 ].zwroc() << " " << zmienna[ 2 ].zwroc() << " " << zmienna[ 3 ].zwroc() << " " << zmienna[ 4 ].zwroc() << endl;
    delete[] zmienna;
}
P-5372
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).
P-5373
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"?
P-5374
DejaVu
» 2009-04-07 22:36:24
C/C++
int * dane = NULL;
cout << sizeof( dane ) << endl; //wyświetli 4 bajty
int * dane = new int[ 123 ];
cout << sizeof( dane ) << endl; //wyświetli 4 bajty
int * nowy_wskaznik = NULL;
nowy_wskaznik = dane; // przekopiuje 4 bajty (adres na który wskazuje zmienna)
nowy_wskaznik[ 10 ] = 15;
delete[] dane; // pamięć zarezerwowana zostaje zwolniona
nowy_wskaznik[ 10 ] = 5; // tutaj program się wywali - zasoby zostały zwolnione i używasz wskaźnika, który jest już nieprawidłowy.
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.
P-5375
« 1 » 2
  Strona 1 z 2 Następna strona