Dynamiczne tablice i przeciążanie dla nich operatorów

0

Hej mam kilka pytań odnośnie dynamicznych tablic.

  1. int Tablica[5] to jest tablica statyczna tak?
  2. cin>>i
    int *Tablica= new int[i] to jest tablica statyczna czy dynamiczna?
    a)Jeżeli jest to tablica dynamiczna to co jak odwołam się do elementu większego niż i, np Tablica[i+2]=5; albo cout<<Tablica[i+5];
  3. Co uważacie o takim konstruktorze klasy, czy można powiedzieć że ten konstruktor tworzy mi tablicę dynamiczną?
 class Wektor
 {
    public:
    int ile,x;
    int *Tablica;
    Wektor(int);
    ....
   }
    Wektor::Wektor(int size)
    { cout<<"Uruchamiam konstruktor"<<endl;
     this->ile=size;
     Tablica= new int[ile];
    }
  1. Czy żeby tablica była dynamiczna to muszę zarezerwować pamięć na tablice statyczną (np 5 elementów) i za każdym razem gdy zwiększam ilość elementów tablicy to muszę zarezerwować pamięć dla nowej tablicy statycznej (teraz 6 elementów), potem skopiować wszystkie elementy ze starej tablicy od 0 do 4, dodać nowy element a starą tablicę usunąć? Czy po prostu proszę o zwiększenie pamięci dla tablicy którą zadeklarowałem na początku?

Bardzo proszę o dyskusję na ten temat.
Dziękuje

1

Ad 1. Tak
Ad 2. dynamiczna. a) Cokolwiek może się stać - UB
Ad 3. Tak
Ad 4. Statycznej nie podmienisz, od początku ma być dynamiczna, reszta ok, no chyba że zrobisz to przez malloc() i realloc().

0

Mam napisać program gdzie będę przeciążał operatory. Np. Tablica1=Tablica2+Tablica3. Mam zrobić dwa warianty dla tablicy statycznej i dynamicznej. Dla tablic statycznych nie będzie to trudne bo kolejne elementy będą się sumować. Ale dla tablicy dynamicznej pojawia się problem bo co jak jedna tablica będzie miała np 3 a druga 5 elementów? Napisałem coś takiego

 
Wektor operator+(Wektor &Objekt)
    {
        Wektor TEMP(this->ile);
        for(int i=0; i< this->ile;i++)
        {
         TEMP.Tablica[i]=this->Tablica[i]+Objekt.Tablica[i];
        }
        return TEMP;
    }

Niby działa dobrze, bo jak przekraczam wielkość tablicy to mam tam zera, ale zastanawiam się czy tak będzie zawsze i czy powinienem dodać jakiś warunek który do zmiennej większej tablicy dodaje zera w przypadku gdy tablice są różnych rozmiarów?
Bo jeżeli tak to chyba muszę dodać dwa IF'y jeden dla przypadku gdy pierwsza tablica jest większa i drugi w przypadku gdy druga jest większa. Może jakiś lepszy pomysł jak to zrobić?
Kilka pytań:

  1. czym się różni przeciążenie gdy używam wcześniej słówka friend bo w tedy w nawiasie mogę podać referencje do dwóch elementów?
  2. czy koniecznie muszę dodać tu this?
  3. Który obiekt trafia w tym przeciążeniu pod &Objekt w przypadku Wektor1=Wektor2+Wektor3?
0

Jak wyłazisz poza przydzieloną pamięć to możesz tam spotkać nawet różowe słonie.
Wg mnie powinien być wyjątek jeżeli dodajesz różne rozmiary, no chyba że to co robisz to nie wektor a coś innego.
Ad 1. google + friend
Ad 2. jak nie masz konfliktu nazw to this nie potrzebujesz.
Ad 3. Wektor2 -> this; Wektor3 -> Obiekt; (ale czy nie zastanawiałeś się nad tym że szybciej wyświetlić adres w programie niż pisać na forum i czekać na odpowiedź)

0

Piszę na forum bo wiem, że są tu ludzie z ogromną wiedzą i mogę w mniejszym lub większym stopniu liczyć na ich pomoc, co nie oznacza że sam w tym czasie nic nie robię, bo ciągle eksperymentuje . Na tą pamięć nie wpadłem, chociaż dziś już korzystałem z tego gdy rozwiązywałem problem z tablicami dynamicznymi. Nie wiem dla czego ale przy tworzeniu trzech obiektów z tablicą dynamiczną każda z tablic miała ten sam adres, co powodowało błędy, ale metodą prób i błędów udało mi się.
BTW jest dla C++ coś takiego jak debugery do ASM, gdzie mogę obserwować bezpośrednio bloki pamięci? Z takim narzędziem wyśmienicie mi się pracowało i o wiele lepiej rozumiałem to co czytałem na temat pamięci.

0

Większość IDE ma wbudowany debugier, nawet DevC++

1 użytkowników online, w tym zalogowanych: 0, gości: 1