[c++] Pointer auf konstanten Pointer-Parameter setzen

digitalFreeman

Grünschnabel
Hallo,

ich verstehe nicht, was an folgendem Gedanken verkehrt ist. Ich habe den Listenkopf einer verketteten Liste und möchte meinetwegen die Größe meiner Liste über eine Methode GetListSize(...) bestimmen.

Nehmen wir mal folgendes:
Code:
struct linked_list
{
   int value;
   linked_list *next;
};


Nun möchte ich gerne, dass der Methode GetListSize(...) als Parameter der Zeiger auf den Listenkopf übergeben wird. Um Auszudrücken, dass der übergebene Zeiger durch die Methode nicht verändert wird, wollte ich den Parameter als konstant auszeichnen. Also in etwa sowas:
Code:
int Klasse::GetListSize( const struct linked_list *head )  
{
   // Zeiger kopieren
   struct linked_list *entry = head;
   int size = 0;
   while( entry != NULL )
   {
      size++;
      entry = entry->next;
   }
   return size;
}


Der Compiler meckert allerdings, dass in der Zeile
Code:
   struct linked_list *entry = head;
eine ungültige Konvertierung stattfindet: invalid conversion from `const entry*' to `entry*'.

Die LinkedList ist nur ein Beispiel für mein Problem. Ich möchte eigentlich nur wissen, wieso ich keinen konstanten Pointer-Parameter innerhalb der Methode kopieren kann. Eigentlich möchte ich halt ausdrücken, dass der übergebene Zeiger unverändert bleibt. Was ist an der obigen Lösung falsch? Wieso kann ich keine Kopie des Pointers erzeugen? Wie kann ich das gewollte stattdessen ausdrücken, nämlich dass der übergebene Zeiger nicht verändert wird?
 
Ich möchte eigentlich nur wissen, wieso ich keinen konstanten Pointer-Parameter innerhalb der Methode kopieren kann. Eigentlich möchte ich halt ausdrücken, dass der übergebene Zeiger unverändert bleibt. Was ist an der obigen Lösung falsch? Wieso kann ich keine Kopie des Pointers erzeugen? Wie kann ich das gewollte stattdessen ausdrücken, nämlich dass der übergebene Zeiger nicht verändert wird?
Der Zeiger bleibt sowieso unverändert, da er als Kopie übergeben wird. Was der Funktionskopf eigentlich ausdrückt, ist: der Wert, auf den der Zeiger verweist, wird in der Funktion nicht verändert. Vermutlich meintest du das auch so und hast es in deinem Beitrag nur etwas unklar formuliert.

Du kannst den Zeiger in der Funktion nach belieben kopieren, allerdings darfst du dabei den const-Qualifizierer nicht einfach unter den Tisch fallen lassen. In dem Falle müsste es also heißen:
C++:
const struct linked_list *entry = head;

Grüße, Matthias
 
Zuletzt bearbeitet:
Um zu sagen, das der Zeiger nicht verändert werden darf, kann man folgendes schreiben:
Code:
struct linked_list* const head
 
Danke für den Hinweis, SGSSGene.

Ich habe inzwischen auch noch mal in Ruhe den entsprechenden Beitrag über Zeiger in C++ auf de.wikibooks.org durchgelesen. Dort insbesondere den Abschnitt Zeiger und const. Aus Java bin ich es einfach nicht gewohnt gewesen, dass const rechts von dem, worauf es sich bezieht, steht.
 
Zurück