Namensräume

Namensräume wurden teilweise schon im Kapitel für die Klassen aufgegriffen und zwar da, wo es um gleichname Member zweier Basisklassen ging. In dem Kapitel ging es darum, folgende Fehlermeldung zu beheben:

main.cpp: In function ‘int main():
main.cpp:10: error: request for member ‘GetLength’ is ambiguous
string.h:11: error: candidates are: unsigned int String::GetLength()
list.h:17: error:                   unsigned int List::GetLength()

In diesem Kapitel geht es nun erstmal darum, die Fehlermeldung zu verstehen. Klassen bilden nämlich Namensräume und innerhalb der Klassen befinden sich die Methoden im Namensraum der Klasse. Der Namensraum hat den gleichen Namen wie die Klasse. Durch die Mehrfachableitung ergibt sich hier das Problem, dass zwei Elemente gleichen Namens in einen gemeinsamen Namensraum NamedList wiederfinden. Beim Aufruf des Elements GetLength() weiß der Compiler nicht, ob er den Namen GetLength() nun aus dem Namensraum String oder aus dem Namensraum List gewählt werden soll.

Die zwei Doppelpunkte sind der Zuordnungsoperator zwischen einem Namensraum und dem zugehörigen Element.

Das Problem mit den mehrfachen gleichbenannten Element innerhalb von mehreren Basisklassen ergibt sich jedoch nicht nur bei Elementen von Klassen.
Je größer Softwareprojekte werden, desto schwieriger wird es Klassen- und Funktionsnamen sinnvoll zu unterscheiden. So können sich auch Klassennamen wiederholen. Ein beliebter Begriff ist „Token“. Ein Token könnte eine Spielfigur sein, aber eben auch ein Kurzzeichen, um einen einmal erkannten Zustand mit einem einzelnen Zeichen zu beschreiben. Wenn man nun zwei Klassen hat, die den gleichen Namen haben, hat man erstmal ein Problem. Man muss also die Klassen umbennen, z.B. ChessToken und CompilerToken.

C++ bietet hier aber auch die Möglichkeit, einzelne Projekte in sogenannte Namensräume zu unterteilen. So kann ein Token für ein Spielprojekt im Namensraum des Spiels liegen und das Compilertoken im Namensraum des Compilerprojektes liegen. Solange sie in unterschiedlichen Namenräumen liegen, dürfen die Klassen auch gleiche Namen haben - halt einmal ein Token für ein Spiel und einmal ein Token für den Compiler.

Ein Namensraum ermöglicht es nun, Klassen einzelnen Projekten zuzuordnen.