Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] Przeladowanie operatora []

michallen23 30 Mar 2009 19:52 3443 7
  • #1 30 Mar 2009 19:52
    michallen23
    Poziom 9  

    Hej mam pytanie , przeladowuje sobie operator [] , zwraca mi referencje do tablicy double i mam problem z nastepujacym problemem :

    - chce aby po przypisaniu liczby do tablicy w klasie WEKTOR od razu mi ja sortowalo czyli np

    Code:
    WEKTOR liczby(10);
    
    liczby[3] = 5;


    powedzmy ze w wektorze sa same zera , wiec chce zeby 5 znalazlo sie na koncu , czy mozna tak posortowac juz w samym przeladowaniu tego operatora ?

    KOD:

    Code:
    double &vector::operator[](int liczba)
    
     {
       if(liczba >= 0 && liczba < dlugosc_wektora)
          return wektor[liczba];
       else
       {
          static double blad = NULL;
          cout << "Podales zly indeks!\n";
          return blad;
       }
     }


    czy moge gdzies tu wkleic funkcje sortujaca czy musze to zrobic osobna metoda ?

    z gory dzieki za odpowiedzi , pozdrawiam

    Post był raportowany. Proszę umieszczać kod w znacznikach code.
    W j. polskim przed znakami interpunkcyjnymi nie dajemy odstępu.
    [Dr.Vee]

  • #3 30 Mar 2009 20:54
    Dr.Vee
    VIP Zasłużony dla elektroda

    Tak jak pisze Dżyszla - nie jest to dobry pomysł.
    Żeby to osiągnąć musiałbyś z operatora[] zwracać referencję do obiektu (na pewno nie double&), który wie, w jakim wektorze się znajduje. Co będzie, jeśli zapiszemy referencję, a wektor zniszczymy? Albo jeśli obiekt znajduje się w wielu wektorach na raz? Itp itd.

    Do utrzymywania wektora posortowanych elementów możesz użyć struktury sterty opartej np. na tablicy.

    Pozdrawiam,
    Dr.Vee

  • #4 30 Mar 2009 21:23
    michallen23
    Poziom 9  

    acha , czyli moj nauczyciel to jeden wielki leszcz , skoro dal takie zadanie, dzieki za odpowiedzi :)

  • #6 23 Kwi 2009 16:42
    michallen23
    Poziom 9  

    No dokładnie takie jest zadanie :)
    " ...Następnie należy utworzyć klasę svect dziedziczącą z klasy vect, która reprezentuje posortowany wektor co oznacza że liczby przechowywane wewnątrz wektora w klasie svect zawsze są posortowane " .
    Pytałem się go jak to zrobic , to powiedzial mi , ze musze ta referencje zwracac do jakiejs klasy tymczasowej , tam to sortowac bodajze w konstruktorze i przypisywac juz tej klasie "oryginalnej" , albo cos z konwersja ale nie zaczailem o co mu chodzi. Jezeli ktos mialby pomysl jak to zrobic , z gory dzieki za odpowiedz

  • #7 24 Kwi 2009 00:42
    Dr.Vee
    VIP Zasłużony dla elektroda

    Jest jeszcze inny problem - referencja zwracana przez operator[] może być wykorzystana w wielu kontekstach - zarówno jako l-wartość (przypisanie do elementu), wyrażenie (wartość elementu) oraz referencja do elementu (którą można zachować i odwołać się do niej później).

    Już wiesz, że operator[] nie może zwrócić typu double&. Wartość zwracana musi:
    1) być konwertowalna do double (użycie jako wartość w wyrażeniu).
    2) mieć przeciążony operator przypisania
    3) mieć połączenie (wskaźnik/referencję) do wektora elementów (żeby można było go sortować).

    Nazwijmy ów typ elem_ref.

    A więc mamy

    Code:
    elem_ref& svect::operator[](unsigned i) { elem_ref* rv = new elem_ref(...); return *rv; };
    Teraz ktoś musi być odpowiedzialny za zwalnianie obiektów typu elem_ref. Może być to sam wektor, lub jeśli zabroni się kopiowania obiektów typu elem_ref, to każdy z nich może usuwać się sam - albo po konwersji do double(), albo po przypisaniu do niego wartości double.

    Czyli: wszystko da się zrobić, ale wychodzi z tego niezły misz-masz i w sumie nie wiadomo czego takie ćwiczenie miałoby nauczyć...

    PS. konwersję elem_ref do double robisz tak:
    Code:
    class elem_ref {
    
        public:
            operator double() { return ...; };
    };

    Pozdrawiam,
    Dr.Vee

  • #8 26 Kwi 2009 19:52
    michallen23
    Poziom 9  

    Kurcze dzieki , nie wiem czy jest to na moj poziom wytlumaczone , ale postaram sie to przestudiowac co napisales i to zrobic . A co do celu tego cwiczenia , to generalnie jest to cwiczenie z dziedziczenia hehe , najpierw byla klasa vect , a svect z niej dziedziczy do tego sortujac przy KAZDEJ operacji z klasy vect . Moj genialny prowadzacy piszac to pewnie nie przewidzial "malutkiego" szczegolu - sortowania przeladowanym operatorem przypisania :)

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME