Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

1 Zum Seitenanfang

Freitag, 30. Mai 2008, 08:25

:: 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?
 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

2 Zum Seitenanfang

Freitag, 30. Mai 2008, 13:30

Namespaces != Klassen, aber Klassen liegen jeweils in ihren eigenen Namespace, wenn du also

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

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »silence« (30. Mai 2008, 13:33)

 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

3 Zum Seitenanfang

Freitag, 30. Mai 2008, 14:33

Mit :: kann man in deinem Beispiel aber doch nicht zugreifen weil :: voraussetzt das test() (von TestA) eine statische methode ist (oder gillt das nur für felder?).

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »nocturne« (30. Mai 2008, 14:34)

 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

4 Zum Seitenanfang

Freitag, 30. Mai 2008, 20:39

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:

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

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »silence« (30. Mai 2008, 20:47)

 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

5 Zum Seitenanfang

Freitag, 30. Mai 2008, 22:39

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:

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)

 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

6 Zum Seitenanfang

Freitag, 30. Mai 2008, 23:47

Ja, statische Variablen müssen initialisiert werden, oder was war jetzt die Frage?
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

7 Zum Seitenanfang

Sonntag, 1. Juni 2008, 15:07

... das vendetta::rabbit 2 mal deklariert ...
Das das überhaupt geht macht mich stutzig.
 

jperl

Super Moderator

Dabei seit: 09.04.2003

Beiträge: 3 453

 

8 Zum Seitenanfang

Sonntag, 1. Juni 2008, 15:55

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
Konfuzius [chinesischer Philosoph (551 - 479 v. Chr.)]
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.