Probleme beim Erzeugen dynamischer Arrays....



  • Hallo,

    Wenn ich versuche einem Array dynamisch Listen wie folgt zuzuweisen:

    class HashTable {
    
    List <V>* table;
    	int size;
    
    void addList (int index) {
    		if (size == 0) {
    			table[index] = new List<V>;
    		}
    		if (table[index] == NULL) {
    			table[index] = new List <V>;
    		}
    	}
    .....
    };
    

    kommt folgende Fehlermeldung:

    error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'List<V> *' akzeptiert (oder keine geeignete Konvertierung möglich)

    Woran könnte das liegen, und was kann man da tun...

    Gruß

    Generic412



  • table ist ein Zeiger auf eine list<> (der noch dazu anscheinend ins Nirvana zeigt). Damit ist table[index] ein list<> - und dem kannst (und brauchst) du keinen Zeiger zuweisen. Stattdessen müsstest du das Array vergrößern, auf das table zeigt, z.B. so:

    if(index>size)
    {
      List<V>* tmp = new List<V>[index];
      for(int i=0;i<size;++i) tmp[i]=table[i];
      delele[]table;
      table = tmp;size=index;
    }
    


  • Also
    1. Hat deine Klasse kein Array als Member, sondern einen Zeiger auf eine Liste, d.h. du kannst so nur eine Liste speichern.
    Richtig müsste das so aussehen:

    List<V>** table; //Array von Zeigern
    table = new List<V>[n]; //wobei n die größe ist
    table[n] = new List<V>;
    

    2. Zu deinem Problem, dass du tatsächlich beschrieben hast:
    List ist eine Tamplate-Klasse, d.h. du musst auch einen Template-Parameter angeben, mit dem diese List erzeugt wird. Z.B. List<int>.
    Das machst du aber, zumindest in dem gegebenen Code nicht. Du könntest nun, da du dich scheinbar nicht im Typ festlegen willst, deinerseits die Klasse HashTable ebenfalls als Template deklarieren.

    tamplate<typename V>
    class HashTable { 
    
    List <V>* table; 
        int size; 
    
    void addList (int index) { 
            if (size == 0) { 
                table[index] = new List<V>; 
            } 
            if (table[index] == NULL) { 
                table[index] = new List <V>; 
            } 
        } 
    ..... 
    }; 
    
    //Benutzung:
    HashTable<int> foo;
    


  • Verstehe ich das richtig?

    Wenn ich :

    List <V>* table = new List <V>[size];
    

    schreibe, habe ich einen Zeiger (table), der auf ein Array mit Listen verweist...
    Ist dieses Array dann dynamisch, so dass ich keine feste Größe (size) angeben muss?

    Generic412



  • Das ist zumindest soweit dynamisch, daß du die Größe erst zur Laufzeit festlegen mußt. Aber spätestens beim new-Aufruf muß bekannt sein, wie groß das Array werden soll.

    Edit @viande: Ein Zeiger muß nicht unbedingt auf ein einzelnes Objekt zeigen, dahinter kann sich auch ein komplettes Array befinden (allerdings kannst du nicht portabel herausfinden, wie groß dieses Array ist).



  • viande schrieb:

    Also
    1. Hat deine Klasse kein Array als Member, sondern einen Zeiger auf eine Liste, d.h. du kannst so nur eine Liste speichern.
    Richtig müsste das so aussehen:

    List<V>** table; //Array von Zeigern
    table = new List<V>[n]; //wobei n die größe ist
    table[n] = new List<V>;
    

    2. Zu deinem Problem, dass du tatsächlich beschrieben hast:
    List ist eine Tamplate-Klasse, d.h. du musst auch einen Template-Parameter angeben, mit dem diese List erzeugt wird. Z.B. List<int>.
    Das machst du aber, zumindest in dem gegebenen Code nicht. Du könntest nun, da du dich scheinbar nicht im Typ festlegen willst, deinerseits die Klasse HashTable ebenfalls als Template deklarieren.

    tamplate<typename V>
    class HashTable { 
    
    List <V>* table; 
        int size; 
    
    void addList (int index) { 
            if (size == 0) { 
                table[index] = new List<V>; 
            } 
            if (table[index] == NULL) { 
                table[index] = new List <V>; 
            } 
        } 
    ..... 
    }; 
    
    //Benutzung:
    HashTable<int> foo;
    

    Danke,
    hat mir sehr weitergeholfen 🙂
    Wenn ich den Beitrag vorher gesehen hätte, hätte ich meinen letzten Beitrag nicht verfasst. Jetzt ist alles klar... 👍

    Gruß
    Generic412



  • CStoll schrieb:

    Das ist zumindest soweit dynamisch, daß du die Größe erst zur Laufzeit festlegen mußt. Aber spätestens beim new-Aufruf muß bekannt sein, wie groß das Array werden soll.

    Edit @viande: Ein Zeiger muß nicht unbedingt auf ein einzelnes Objekt zeigen, dahinter kann sich auch ein komplettes Array befinden (allerdings kannst du nicht portabel herausfinden, wie groß dieses Array ist).

    Ebenso Danke an CStoll 🙂


Anmelden zum Antworten