001
03.08.2004, 21:40 Uhr
virtual
Sexiest Bit alive (Operator)
|
Das ist in C++ der sogenannte "Scope Resultion Operator". Hört sich schlimmer an, als es eigentlich ist: Alles, was in C/C++ Rang und Namen hat, hat einen bestimmten Gültigkeitsbereich. zB sind variablen, die man in einer Funktion lokal definiert auch nur innerhalb der Funktion (genau: ab deklaration bis zur korrespondierenden geschweiften Klammer zu) "sichtbar", also ansprechbar:
C++: |
void f() { foo; { int eine Variable; // Abhier ist Variable sichtbar/absprechbar ... } bar; // Hier ist die Variable nicht mehr sichtbar. }
|
Ebenso ergeht es Membervariablen/methoden von Klassen und bestimmten Funktionen (eben solche, die Statisch deklariert sind). Daneben gibt es noch andere Gültigkeitsbereiche, nämlich Namespaces. Gültigkeitbereiche sind "Scopes". Bei lokalen Variablen leuchtet es sofort ein, daß diese nur in der Funktion sichtbar/ansprechbar sein sollen, denn lokale Variablen sollen eben nicht von außerhalb der Funktion veränderbar sein.
Nun gibt es aber andere Scopes, bei denen man ggf. will, daß man auch von außen auf die in ihnen enthaltenen Symbole zugreifen kann. Dies sind zwei Scope typen: 1. Klassen. 2. Namespaces.
namespace Dienen im wesentlichen dazu, namenskonflikte zu vermeiden: Nehmen wir an, du hast eine nette Klasse geschrieben, welche eine Matrix realisiert. Sinnvollerweise nennst Du die Klasse "matrix". Ich bin auf die gleiche Idee gekommen und schreibe auch eine solche Klasse, mit gleichen Namen. Jemand anders will - auswelchen Gründen auch immer - nun sowohl deine alsauch meine matrix klasse verwenden. Das würde erstmal nicht funktionieren: er müsste sich wegen der One Definition Rule in C++ für eine Matrix Klasse entscheiden, weil sie ja gleich heissen. Eine solche Situation kann tatsächlich auftreten und um ihr aus dem Weg zu gehen, hat man Namespaces erfunden: man kann als einen Gültigkeitsbereich schaffen, in dem der Name der Klasse ansprechbar sein soll, etwa so:
C++: |
namespace vns { // virtuals namespace class matrix { ... };
} // ENde namespace
|
Solange Du dich in der geschweiften Klammer vom Namespace aufhälst, kannst Du die Klasse matrix "normal" nutzen. Wenn Du ausserhalb bist, mußt du zusätzlich angeben, welche Matrix klasse du benutzen willst:
C++: |
vns::matrix x; // Ich will die matrix aus dem namespace vns
|
Oder aber (eher schlechter Stil):
C++: |
using namespace vns; // Importiere alle Symbole aus dem Namespace vns matrix x;
|
Oder (etwas besserer Stil):
C++: |
using vns::matrix; // Wenn wir matrix nehmen, dann aus dem Namespace vns matrix x;
|
Standard C++ kommt mit der STL daher und damit mit einer Reihe Templates / Klassen /Typen. Diese stehen in dem Namespace "std". Generell kann ich Dir nur empfehlen, auf diesen using Unsinn zu verzichten, weil Namespaces schon ihren Sinn haben und using dies konterkariert.
Aber auch bei Klassen benätigt man hin und wieder Diesen Sc.Res.Op.:
C++: |
class MyStaticHelper { public: static void helper(); };
|
Diese statische Method kann man so aufrufen:
C++: |
MyStaticHelper::helper();
|
wäre das jetzt alles im Namespace vns gewesen natürlich:
C++: |
vns::MyStaticHelper::helper();
|
-- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 03.08.2004 um 21:43 Uhr von virtual editiert. |