:: für methodenzugriff (C++)
Hi,
ich dachte immer :: wäre nur für namensbereiche (namespace's) da.
Das mit :: auch auf statische Felder einer Klasse zugegriffen werden können das hatte ich nicht gelernt.
Ist doch eigentlich überflüssig, oder muss ich das so verstehen das alle namespaces eigentlich c++klassen sind?
ich dachte immer :: wäre nur für namensbereiche (namespace's) da.
Das mit :: auch auf statische Felder einer Klasse zugegriffen werden können das hatte ich nicht gelernt.
Ist doch eigentlich überflüssig, oder muss ich das so verstehen das alle namespaces eigentlich c++klassen sind?
Namespaces != Klassen, aber Klassen liegen jeweils in ihren eigenen Namespace, wenn du also
hast, musst du, falls du innerhalb der Klasse auf die äussere, globale Funktion zugreifen willst, ::test(); schreiben.
Du kannst übrigens nicht nur auf statische Felder zugreifen. Wenn du in einer subklasse TestB bist, welche von TestA erbt, könntest du über TestA::test(); auf die test() funktion von TestA zugreifen.
Der :: ist also kein Namespace Operator, sondern der sog. Qualifizierungsoperator.
|
|
Quellcode |
1 2 3 4 5 6 |
int test();
class TestA
{
int test();
};
|
hast, musst du, falls du innerhalb der Klasse auf die äussere, globale Funktion zugreifen willst, ::test(); schreiben.
Du kannst übrigens nicht nur auf statische Felder zugreifen. Wenn du in einer subklasse TestB bist, welche von TestA erbt, könntest du über TestA::test(); auf die test() funktion von TestA zugreifen.
Der :: ist also kein Namespace Operator, sondern der sog. Qualifizierungsoperator.
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »silence« (30. Mai 2008, 13:33)
Doch, kann man, da der Konstruktoraufruf der Subklasse den Konstruktur der Basisklasse aufruft. Es gibt da eine Ausnahme (wie in meinen Beispiel), mit einer Initalisierungsliste wird der Konstruktor der Basisklasse vor dem Konstruktor der Subklasse aufgerufen.
Das Beispiel Funktioniert so ohne Probleme!
Edit: Kompilier dir das mal, vielleicht wird das etwas verständlicher...ist ein Grundkonzept der OOP:
musst evtl. _tmain in main ändern, ist ein unicode projekt.
Das Beispiel Funktioniert so ohne Probleme!
Edit: Kompilier dir das mal, vielleicht wird das etwas verständlicher...ist ein Grundkonzept der OOP:
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#include <iostream>
#include <conio.h>
void Test()
{
std::cout << "Ich bin Global Test" << std::endl;
}
class TestA
{
public:
TestA()
{
std::cout << "Ich bin Ctor von A" << std::endl;
}
void Test()
{
std::cout << "Ich bin Test von A" << std::endl;
}
};
class TestB : public TestA
{
public:
TestB() : TestA()
{
std::cout << "Ich bin Ctor von B" << std::endl;
}
void Test()
{
std::cout << "Ich bin Test von B" << std::endl;
}
void ShowTests()
{
::Test();
TestA::Test();
Test();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
TestB test;
test.ShowTests();
getch();
return 0;
}
|
musst evtl. _tmain in main ändern, ist ein unicode projekt.
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »silence« (30. Mai 2008, 20:47)
ich glaube da schreiben wir jetzt aneinander vorbei. Vererbung interessiert mich diesbezüglich nicht, bzw. das wusste ich schon vor 7 Jahren *g*.
ich kann dir mein Problem nur schwer verständlich machen weil ich hier keine ent. umg. habe.
Im wesentlichen Beeindruck mich die follgende c++ konstelation:
was sich wohl ohne die Definition der Klasse gar nicht Kompilieren lässt.
Hier ergeben sich für mich die Besonderheit das vendetta::rabbit 2 mal deklariert, und 1 mal instanziiert wird.
ich kann dir mein Problem nur schwer verständlich machen weil ich hier keine ent. umg. habe.
Im wesentlichen Beeindruck mich die follgende c++ konstelation:
|
|
PHP-Quelltext |
1 2 3 4 5 6 7 8 9 |
class vendetta
{
static MString rabbit;
}
MString vendetta::rabbit = "daylight";
...
cout << vendetta::rabbit;
...
|
was sich wohl ohne die Definition der Klasse gar nicht Kompilieren lässt.
Hier ergeben sich für mich die Besonderheit das vendetta::rabbit 2 mal deklariert, und 1 mal instanziiert wird.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »nocturne« (1. Juni 2008, 15:05)
naja die deklaration erfolgt innerhalb der klasse, jedoch die definition außerhalb.
das hier bringt vl ein wenig licht ins dunkel:
http://userpage.fu-berlin.de/~ram/pub/pu…ische-variablen
jperl
das hier bringt vl ein wenig licht ins dunkel:
http://userpage.fu-berlin.de/~ram/pub/pu…ische-variablen
jperl
Konfuzius [chinesischer Philosoph (551 - 479 v. Chr.)]
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.


