Vergleiche in Klassen

OP #7484505
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 :)

#7484563
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.

#7485995
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.

#7486084
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren