Liste in Klasse zugreifbar machen (Pointer)



  • Hallo liebe Community,
    ich soll mit Hilfe einer Interface Klasse eine umsortierungsroutine implementieren. Die Klasse SwapShuffle ist eine abgeleitete Klasse des Interfaces. Mit der getElement Methode sollen einzelne Elemente aus der dataList geholt werden, die in einer init Methode angelegt wird. Meine Frage ist, wie ich die Liste für die getElement Methode bereitstelle.
    Mein Code sieht verkürzt so aus:

    Class SwapList:Public Interface
    private:
    int *dataList ;
    Public:
    void init(int n) ;
    Int getElement (Index);

    Void SwapShuffle::init(int n){
    list <int> dataList;
    //Befüllung mit for-schleife
    }

    Void SwapShuffle:: getElement (Index){
    dataList ?
    }



  • Erstens kompiliert deine Kacke nicht und zweitens was soll das:

    @alexsch sagte in Liste in Klasse zugreifbar machen (Pointer):

     int *dataList ;
    

    ?



  • Du übergibst Deiner Klasse einfach eine Referenz auf Deine Liste, zB:

    #include <list>
    #include <iostream>
    
    class SwapList
    {
    	public:
    		SwapList(std::list<int> &li) : DataList(li)
    		{
    		}
    
    	
    		void PrintElements() const
    		{
    			for(auto it = DataList.begin(); it != DataList.end(); ++it)
    			{
    				std::cout << *it << '\n';
    			}
    		}
    		
    	private:
    		std::list<int> const &DataList;
    };
    
    int main()
    {
    	std::list<int> List;
    	
    	List.push_back(12);
    	List.push_back(15);
    	List.push_back(14);
    	
    	SwapList swList(List);
    	
    	swList.PrintElements();
    }
    

    So in etwa sollte übrigens auch Dein Code aussehen, wenn du hier Fragen dazu stellen möchtest, also ein vollständig kompilierbares Beispiel, auf das Nötigste reduziert.

    Edit:
    Wenn Du die Liste in Deiner Klasse in place umsortieren willst, darf die Referenz natürlich nicht const sein.



  • @Swordfish bin noch nicht so vertraut mit der Plattform hier. Warum Zeile 3 so da steht weiß ich ehrlich gesagt nicht, ist aber vorgegeben worden durch meinen Prof.

    class SwapShuffle:public IListOfNumbers{
    private:
        int *dataField;
    public:
        void shuffle();
        void init(int n);
        int getElement(int index);
        void out();
    };
    

    Dann ist hier die init Methode:

    void SwapShuffle::init(int n){
    
        list<int> dataField_;
        for (int i=1; i<n; i++)
         {
          dataField_.push_back(i);
          cout<<i<<"  ";
         }
    }
    

    und das hier soll meine getElement Methode werden, aber ich weiß nicht, wie ich ihm die Liste da erkennbar mache...

    int SwapShuffle::getElement(int index){
    
     	list <int> ::const_iterator it;
    	advance(it, index);
        return *it;
    }
    


  • @Belli Danke schonmal. Eigentlich sollte das so aussehen, wie ich es Swordfish geantwortet habe. Ich versuche mal, das anzuwenden was du gemacht hast 😉



  • @alexsch sagte in Liste in Klasse zugreifbar machen (Pointer):

    int *dataField;

    Wenn das int *dataField; wirklich so vorgegeben ist, will dein Prof eher nicht std::list. Wie kommst du darauf?



  • Das ist aber keine guter (noch wohlformend ausgedrückt) C++ Code, den da dein Prof verlangt.
    Aber dann wird dataField wohl ein Zeiger auf einen Speicherbereich darstellen, der in der init-Funktion mittels new alloziert werden soll ("dynamisches Array").
    Dann benötigt die Klasse aber noch einen weiteren Member, welcher die Größe speichert, da man sonst in den beiden anderen Funktionen shuffle und out diese sonst nicht kennt.

    Und die list<int> kannst du dann aus deinem Code löschen...

    int SwapShuffle::getElement(int index)
    {
        return dataField[n]; // ohne Null-Check und Out-of-Index Abfrage
    }
    


  • @Th69 Oh vielen Dank, ich glaube, du hast meine Frage zusammen mit @manni66 beantwortet. Genau, in meiner SwapShuffle Klasse habe ich noch eine size Funktion, die ich schreiben muss, die ist auch vorgegeben. In der Aufgabe, welche auf englisch verfasst wurde, steht halt "Initialises the list of n numbers", was ich natürlich auch als Liste auf deutsch Übersetzt habe, aber wenn ich statt dessen ein Array nehme macht das mehr sinn mit dem return...