Forum: PC-Programmierung Vergleiche in Klassen


von Tim (mski)


Lesenswert?

Hi!
Bin noch ein ziemlicher Neuling in der C++ Welt.
Habe eine Frage zu diesem Operator "::".

Und zwar habe ich diesen im folgendem Beispiel gesehen:
1
if(erzeugtes Objekt einer Klasse.Member-/Elementfunktion der Klasse() == Klasse::Zustand_X von return?)
2
{
3
  //mach was
4
}

Verstehe ich das richtig, dass eine für das Objekt erzeugte Funktion 
aufgerufen wird "Objekt.Funktion()" und geschaut wird, ob der Wert der 
aufgerufenen Funktion mit der der Klasse und dem gefordertem Wert 
verglichen wird?

Zu dem genanntem Operator habe ich nur die Namen 
"Bereichsauflösungsoperator" und "Qualifizierung" gefunden. Beides nicht 
hilfreich für mich.

Danke :)

von Harald K. (kirnbichler)


Lesenswert?

Zeig' mal ein nicht mit Deinen Begriffen verstümmeltes Beispiel.

Es ist nicht zu erkennen, wo Deine Begriffe anfangen und aufhören.

Wenn Du aus "Geheimhaltungsgründen" oder allgemeiner Paranoia nicht die 
Bezeichner des Originals verwenden willst, ersetze halt den Klassennamen 
durch Horst, den Objektnamen durch Ewald, Funktionsnamen durch Detlef 
und --sofern "Wenn Zustand X von return" ein Name eines Elements der 
Klasse sein sollte-- den Namen durch Manfred.

Ich nehme an, daß genau das gemeint ist:
1
if (Ewald.Detlef() == Horst::Manfred)
2
{
3
}

dann gibt es zwei Möglichkeiten, was Manfred sein kann:

Variante A:
1
class Horst
2
{
3
  ... etc.pp.
4
5
  static int Manfred;
6
7
  ... etc.pp.
8
}

Manfred ist eine statische Membervariable. Alle Instanziierungen von 
Horst teilen sich diese Variable, auf die kann sowohl über den 
Klassennamen als auch über den Instanzennamen zugegriffen werden:
1
    Horst Ewald;
2
3
    cout<<"Hallo " << Horst::Manfred;
4
    cout<<"Hallo " << Ewald.Manfred;

Bei der Objektinstanz muss der Punkt-Operator verwendet werden.

Fall B:
1
class Horst
2
{
3
  ... etc.pp.
4
5
  enum
6
  {
7
    Manfred,
8
    Elmar,
9
    Ronnie,
10
    Rolf
11
  };
12
13
  ... etc.pp.
14
}

In diesem Fall ist Horst::Manfred eine Namensraumauflösung. Das enum 
gilt nur innerhalb der Klassendefiniton, bei Zugriffen von außerhalb der 
Klasse muss der Klassenname zur Verdeutlichung angegeben werden.

So etwas wird oft verwendet, um irgendwelchen Rückgabewerte einer 
Memberfunktion sprechende Werte zuweisen zu können, ohne daß es zu 
Namenskonflikten mit anderen Klassen kommt.

Eine andere Klasse namens Thorben könnte nämlich auch so ein enum 
enthalten, bei der die Reihenfolge und also die numerischen Werte der 
Elemente anders ist.

Anders als in C, wo es keine Möglichkeit gibt, zwei derartige Enums in 
der gleichen Übersetzungseinheit zu verwenden, kann in C++ durch die 
Namensraumangabe (hier: Klassenname) so etwas gemacht werden.

von Oliver S. (oliverso)


Lesenswert?

Tim schrieb:
> Zu dem genanntem Operator habe ich nur die Namen
> "Bereichsauflösungsoperator" und "Qualifizierung" gefunden. Beides nicht
> hilfreich für mich.

Das ist aber nunmal das, was es dazu zu sagen gibt.

Oliver

von Wilhelm M. (wimalopaan)


Lesenswert?

Tim schrieb:
> Zu dem genanntem Operator habe ich nur die Namen
> "Bereichsauflösungsoperator" und "Qualifizierung" gefunden. Beides nicht
> hilfreich für mich.

Scope-Operator

von Daniel F. (df311)


Lesenswert?

Harald K. schrieb:
> willst, ersetze halt den Klassennamen
> durch Horst, den Objektnamen durch Ewald, Funktionsnamen durch Detlef
> und --sofern "Wenn Zustand X von return" ein Name eines Elements der
> Klasse sein sollte-- den Namen durch Manfred.

hmm, ob es für das Verständnis so hilfreich ist, wenn sowohl für Klasse 
als auch für Instanz, Funktionsname und Klassenelement ein (männlicher) 
Vorname verwendet wird?

Warum nicht besser sowas wie "Mensch" als Klasse, Vorname als Instanz, 
Funktion z.B. "wieSchwer()" und Element z.B. "zuSchwer"?

wenn ich das kauderwelsch mit den ganzen Vornamen dann übersetze kommt 
für mich sowas wie
1
Mensch Franz;
2
if(Franz.wieSchwer() >= Mensch::zuSchwer) {
3
  Franz.abnehmen();
4
}
heraus.
Oder wenn Menschen aus irgendwelchen Gründen nicht erwünscht sind gehen 
ja auch (Haus)Tiere, Pflanzen, Geometrische Formen, etc.
Halt irgendwas, bei dem Klassenname, Instanz, Eigenschaften, Funktionen 
gut  vorstellbar ist.

von Wilhelm M. (wimalopaan)


Lesenswert?

Bevor man sich hier die Finger wund schreibt, sollte er mal ein C++ Buch 
nehmen. Beispiele, um die Verwendung von statischen Elementen eine 
Klasse deutlich zu machen, sind dort drin, und müssen hier nicht 
abgeschrieben werden.

von Harald K. (kirnbichler)


Lesenswert?

Daniel F. schrieb:
> hmm, ob es für das Verständnis so hilfreich ist, wenn sowohl für Klasse
> als auch für Instanz, Funktionsname und Klassenelement ein (männlicher)
> Vorname verwendet wird?

Sicherlich nicht unbedingt; besser aber als der "Textersatz" des 
Threadstarters ist es allemal. Geholfen scheint es auch zu haben, denn 
der Threadstarter hat seine Fragestellung nicht weiter konkretisiert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.