C++ Tutorial

Schnelle objektorientierte, kompilierende Programmiersprache.
nufan
Wiki-Moderator
Beiträge: 2523
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C++ Tutorial - Const Klasse

Beitrag von nufan » Di Jun 08, 2021 7:02 am

Hallo :)
Xeon hat geschrieben:
Mo Jun 07, 2021 2:28 pm
Konstant, aber doch veränderlich
Nicht alle Datensätze müssen in einem konstanten Objekt unveränderlich sein. Eine Liste kann zum Beispiel konstant sein, wenn kein Element hinzugefügt oder gelöscht wird. Der Zeiger auf ein aktuelles Element darf sich unter Umständen aber doch verändern. So kann man die Variablen, die den Wert der Instanz nicht verändern als mutable kennzeichnen. Diese Mutable-Variablen dürfen dann auch von Funktionen geändert werden, die als const gekennzeichnet sind:
Kann das sein dass dieses Wort "nicht" welches ich unterstrichen habe nicht dazu gehört?
Die Formulierung ist nicht ideal, doch die Aussage im Wiki ist korrekt. Der Begriff "Wert" könnte in diesem Fall etwas zu allgemein sein.

Das im Wiki genannte Beispiel finde ich ziemlich gut:
Wiki hat geschrieben:Eine Liste kann zum Beispiel konstant sein, wenn kein Element hinzugefügt oder gelöscht wird. Der Zeiger auf ein aktuelles Element darf sich unter Umständen aber doch verändern.
Der von außen sichtbare Zustand der konstanten Liste (das heißt die in der Liste gespeicherten Werte) darf nicht verändert werden. Was nun intern passiert (z.B. wenn man über die Liste iteriert, ohne sie zu verändern), sollte den Nutzer dieser Klasse nicht interessieren müssen. Der eigentliche "Wert" der Liste ändert sich für den Nutzer dadurch ja nicht.

Versuchen wir mal den Satz anders zu formulieren:
So kann man die Variablen, die den von außen sichtbaren Zustand der Instanz nicht verändern, als mutable kennzeichnen.
Findest du das besser?

Xeon
Beiträge: 122
Registriert: So Dez 17, 2017 4:10 pm

Re: C++ Tutorial - Const Klasse

Beitrag von Xeon » Di Jun 08, 2021 12:44 pm

nufan hat geschrieben:
Di Jun 08, 2021 7:02 am

Versuchen wir mal den Satz anders zu formulieren:
So kann man die Variablen, die den von außen sichtbaren Zustand der Instanz nicht verändern, als mutable kennzeichnen.
Findest du das besser?
Habe ich das richtig verstanden, die Variablen die z.B. außerhalb der Klasse liegen und sie nicht verändern als mutable bezeichnet werden?

nufan
Wiki-Moderator
Beiträge: 2523
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C++ Tutorial - Const Klasse

Beitrag von nufan » Di Jun 08, 2021 12:58 pm

Xeon hat geschrieben:
Di Jun 08, 2021 12:44 pm
Habe ich das richtig verstanden, die Variablen die z.B. außerhalb der Klasse liegen und sie nicht verändern als mutable bezeichnet werden?
Sie liegen schon innerhalb der Klasse. Aber nicht alles das Teil einer Klasse ist, interessiert den Nutzer davon. Ich denke du wirst auch schon über das "private" Schlüsselwort gestolpert sein. Dieses hilft dabei, Teile von Klassen vor Zugriffen zu schützen. Komplexe Details zu verstecken, um eine möglichst einfache Schnittstelle zu bieten, ist ein wichtiges Konzept der Programmierung.

Xeon
Beiträge: 122
Registriert: So Dez 17, 2017 4:10 pm

Re: C++ Tutorial

Beitrag von Xeon » Di Jun 08, 2021 1:37 pm

Ja das Thema Schlüsselwort private war schon dran.

Jetzt verstehe ich diesen Code:

Code: Alles auswählen

class List
{
  private:
    Node * First;
    Node * Last;
    mutable Node * Current;
  public:
    inline void SetCurrent( Node & current ) const { Current = &current; }
};
Ich finde das Schlüsselwort sollte eher "immutable" statt "mutable" heißen, aber das haben die wahrscheinlich so gemacht wegen der const Funktion.

Xeon
Beiträge: 122
Registriert: So Dez 17, 2017 4:10 pm

C++ Tutorial - Infix-Operatoren überladen

Beitrag von Xeon » Mi Jun 16, 2021 1:37 pm

Hallo zusammen

Komme mal wieder nicht weiter, hier der Link:
https://www.proggen.org/doku.php?id=cpp:operator:infix

Hier der Code:

Code: Alles auswählen

class Fraction
{
  friend Fraction & operator *=( Fraction & lhs, Fraction & rhs );
 
  private:
    int Numerator;
    int Denominator;
  public:
    Fraction( int num, int den ) : Numerator( num ), Denominator( den ) {}
};
 
Fraction & operator *=( Fraction & lhs, Fraction const & rhs )
{
  lhs.Numerator   *= rhs.Numerator;
  lhs.Denominator *= rhs.Denominator;
  return lhs;
}

int main(void)
{
  Fraction a( 1, 2 ), b( 2, 3 );

  a *= b;

  return 0;
}
Habe noch die main Funktion eingefügt. Hier die Fehlermeldungen:

Code: Alles auswählen

In function 'Fraction& operator*=(Fraction&, const Fraction&)':|
9|error: 'int Fraction::Numerator' is private|
17|error: within this context|
9|error: 'int Fraction::Numerator' is private|
17|error: within this context|
10|error: 'int Fraction::Denominator' is private|
18|error: within this context|
10|error: 'int Fraction::Denominator' is private|
18|error: within this context|
||=== Build failed: 8 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Hier noch der Textausschnitt:
Das gleiche Beispiel wie zuvor nun noch einmal. Da wir uns nun nicht mehr innerhalb einer Klasse befinden, können wir den this-Pointer nicht mehr verwenden. Stattdessen lassen wir uns die Referenz auf das Objekt einfach übergeben. Müssen wir auf durch 'privat' oder 'protected' geschützte Daten zugreifen, so muss der Operator als 'friend' definiert werden.
Eigentlich müsste es doch gehen wenn man den Operator als friend definiert? Von Operatorüberladungen habe ich noch keine Ahnung.


Liebe Grüße
Von Xeon

nufan
Wiki-Moderator
Beiträge: 2523
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C++ Tutorial

Beitrag von nufan » Mi Jun 16, 2021 1:47 pm

Im Code fehlt ein "const", damit der Compiler die Funktions-Implementierung der friend-Angabe zuordnen kann:

Code: Alles auswählen

  friend Fraction & operator *=( Fraction & lhs, Fraction const & rhs );
Ich habe den Code im Wiki inzwischen ausgebessert, danke für den Hinweis :)

Xeon
Beiträge: 122
Registriert: So Dez 17, 2017 4:10 pm

C++ Tutorial - Infix-Operatoren überladen

Beitrag von Xeon » Mo Jun 21, 2021 1:30 pm

Habe eine Frage zu diesem Code:

Code: Alles auswählen

class Fraction
{
  private:
    int Numerator;
    int Denominator;
  public:
    Fraction( int num, int den ) : Numerator( num ), Denominator( den ) {}
    Fraction & operator *=( Fraction & rhs );
};
Fraction & Fraction::operator *=( Fraction & rhs )
{
  Numerator   *= rhs.Numerator;
  Denominator *= rhs.Denominator;
  return *this;
}

int main(void)
{
  Fraction a( 1, 2 ), b( 2, 3 );

  a *= b;

  return 0;
}
Der Code ist auch vom C++ Tutorial:
https://www.proggen.org/doku.php?id=cpp:operator:infix

Für was ist der return Wert gut?

Code: Alles auswählen

return *this;
Ich sehe da keine Logik. Danke für die Hilfe im voraus.

nufan
Wiki-Moderator
Beiträge: 2523
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C++ Tutorial

Beitrag von nufan » Mi Jun 23, 2021 7:51 am

Den Rückgabewert brauchst du, um das Ergebnis mit weiteren Operatoren verwenden zu können. Zum Beispiel so:

Code: Alles auswählen

(a *= b) *= c;
Bei zuweisenden Operatoren wie *= würde ich persönlich aus Gründen der Lesbarkeit davon abraten solche Ausdrücke zu basteln. Syntaktisch solltest du dich trotzdem an die Konvention halten und die im Wiki beschriebene Signatur verwenden.

Antworten