przeładowanie operatora [] zwracające wskaźnik

0

Siema,
mam do napisania kopiec zaimplementowany na wskaźnikach, tak więc mam klasę Element:

 class Element{
friend class Kopiec;
    private:
        int liczba;
        Element* left;
        Element* right;
        Element* parent;
    public:
        Element(int a);
       Element* operator[](int index);
};

i klase Kopiec:

 class Kopiec{
    private:
        Element root;
        int ilosc;
    public:
         Kopiec(int a); 
        void Wypisz();
        void Dodaj(int nowa_liczba);   

Wszystko chcę zrobić przez przeładowanie operatora [], czyli że podam numer dodawanego elementu i on mi określi pozycję gdzie mam ten element wkleić. Problem występuje w returnie tegóż przeładowania. Chciałem zwracać wskaźnik na dany element(bądź też wskaźnik aktualnie NULL, któremu dopiero przypiszę element), ale program zwraca mi "cannot convert Element to Element* in assigment w linijce

      Element *temp=root[ilosc];

kombinowałem coś z referencjami, wskaźnikami rzutowaniami i wszystkim i już mam taki mętlik w głowie, że sam tego nie znajdę, dlatego zwracam się o pomoc
zapodaję uproszczone przeładowanie operatora[]

 Element* Element::operator[](int index){
     Element *temp=this;        
         if(!index)  return temp;
.............................
         if(licznik) temp=temp->right;
         else temp=temp->left;
         };
         return temp;
}

dzięki z góry za pomoc

0

Trochę za mało kodu, to co jest wydaje się poprawne.

0

Podejrzewam że zmieniłeś w klasie Kopiec z:
Element root;
na:
Element *root;
więc wiersz:
Element *temp=root[ilosc];
trza zmienić na:
Element *temp=(*root)[ilosc];

0

@Dragon, masz rację, w oryginalnym kodzie jest *root, po prostu później kombinując, zamieniłem wskaźnik na obiekt. Jednak po Twojej modyfikacji nadal nie działa.
Może wyjaśnię bardziej o co chodzi, gdyż ferelny wiersz znajduje się w metodzie Dodaj. Przeładowanie operatora ma zwrócić wskaźnik(a może referencję, sam już nie wiem) i w to miejsce zostanie utworzony nowy element. Ciało metody Dodaj:

 void Kopiec::Dodaj(int nowa_liczba){
     Element *temp;
     temp=(*root)[ilosc]; //po zmianie zaproponowanej przez Dragona
     temp=new Element;  //tutaj chciałbym żeby przez tego tempa obiekt był tworzony także pod oryginalnym wskaźnikiem, np root->left->left, który jest zwracany
                                 //z przeładowania []
     temp->liczba=nowa_liczba;
     ilosc++;
}
0

operator[] zwraca ci wskaźnik, zmieniając później ten wskaźnik zmieniasz tylko jego wartość więc ten nowy obiekt nie podepnie się pod strukturę.
Ale możesz zrobić operator ten operator[] w klasie Kopiec i jeżeli on będzie zwracać referencje do wskaźnika to wtedy się uda.

Element *&Kopiec::operator[](int index)
  {
   ...
  }

Z tym że to się mija z celem :-D

0

Czyli nie da się zrobić tego co chciałbym zrobić? :p Jakoś żeby zwrócić referencję, albo zaprzyjaźnić klasy i zrobić to Twoim sposobem? Przeładowanie operatora jest kluczowe, bo muszę jeszcze dopisać inne metody do tego kopca

0

Dobra, generalnie doszedłem do tego, że mam problem z działaniami na wskaźnikach/referencjach
Zrobiłem, tak jak powiedziałeś, metodę która powinna działać bez przeładowania, ale też nie działa:p Postaram Ci się przybliżyć moje intencje

Wszystkie klasy tak jak wyżej, z tym, że Klasa Kopiec ma składową "Element root", nie jako wskaźnik tylko jako obiekt

void Kopiec::Dodaj(int nowa_liczba){
     Element *temp=&root;      //robie sobie wskaznik na pierwszy element
     if(!ilosc)  {  //pierwszy element
                 temp->liczba=nowa_liczba;
                 ilosc++;
                  return;
                  };

     int temp_ilosc=ilosc;
     temp_ilosc++;
     int licznik=0;
     int binary_number[16];  //do tej tablicy zapisuje numer danego elementu w binarnej
     while(temp_ilosc>1){
              binary_number[licznik]=(temp_ilosc%2);
              temp_ilosc=(int)floor(temp_ilosc/2);
              licznik++;
              };
     for(;licznik>0;licznik--){ //w tej petli odczytuje tablice binarna od konca
                                //i w zaleznosci od wartosci wchodze w dana galaz drzewa
         if(binary_number[licznik-1]) temp=temp->right;
         else temp=temp->left;
         };
     temp=new Element(nowa_liczba); //tworze nowy element do ktorego moge sie odwolywac
                                    //idac od roota
     ilosc++;
     cout<<temp->liczba<<endl;
     cout<<root.left->liczba<<endl; //dla sprawdzenia dodania drugiego elementu, i tu wlasnie program sie wysypuje
}

Dla dodawania pierwszego elementu (czyli pętli "if(!ilosc)") działa. Dla dodawania drugiego elementu teoretycznie działa, ale nie tak jak chcę, czyli nie mogę się odwołać do drugiego elementu wychodząc z roota

0

Otóż nie, posługuje się temp_ilosc, którą to wartość zwiększam o 1. Czyli dla dodawania 2 elementu tem_ilosc=2, 2%2=0 czyli idzie w lewą gałąź.
Moją intencją jest, aby przez linijkę temp=new Element; pod adresem root->left (dla drugiego elementu) tworzył się nowy element.

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