C++ Tutorial

Schnelle objektorientierte, kompilierende Programmiersprache.
Xeon
Beiträge: 169
Registriert: So Dez 17, 2017 4:10 pm

Re: C++ Tutorial - Infix-Operatoren überladen

Beitrag von Xeon » Mi Jun 30, 2021 12:07 pm

Xin hat geschrieben:
Di Jun 29, 2021 4:56 pm
Xeon hat geschrieben:
Di Jun 29, 2021 1:42 pm
Ich glaube da ist ein Fehler im Code:
Wird Zeit, dass ich das nächste Tutorial schreibe... ich habe jedenfalls schon bei diesem gelernt, wieviel ein guter Lektor wert ist. :-D
Ich muss ehrlich sagen das C++ Tutorial war bis jetzt sehr spannend, ich habe viel gelernt.

Wenn du irgendwann mit dem neuen C++ Tutorial fertig bist, hast du dann vor das jetzige drin zu lassen?


Liebe Grüße
Von Xeon

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C++ Tutorial - Infix-Operatoren überladen

Beitrag von Xin » Sa Jul 03, 2021 9:15 am

Xeon hat geschrieben:
Mi Jun 30, 2021 12:07 pm
Xin hat geschrieben:
Di Jun 29, 2021 4:56 pm
Xeon hat geschrieben:
Di Jun 29, 2021 1:42 pm
Ich glaube da ist ein Fehler im Code:
Wird Zeit, dass ich das nächste Tutorial schreibe... ich habe jedenfalls schon bei diesem gelernt, wieviel ein guter Lektor wert ist. :-D
Ich muss ehrlich sagen das C++ Tutorial war bis jetzt sehr spannend, ich habe viel gelernt.

Wenn du irgendwann mit dem neuen C++ Tutorial fertig bist, hast du dann vor das jetzige drin zu lassen?
Das ist eine gute Frage... ich werde vermutlich Teile davon wiederverwerten, denn ich bin grundsätzlich mit dem Aufbau zufrieden und das Know-How zum Thema Objektorientierung ist ja nicht veraltet.

Ich möchte lediglich den Einstieg beim Programmieren lernen algorithmischer machen, so dass man mehr von der Standard-Library mitbekommt und besser weiß, was eigentlich schon mitgeliefert wird und wie man das benutzt.
Also statt C-Arrays eher std::arrays, damit ich mit for( auto... ) darüber iterieren kann, was derzeit noch gar nicht abgedeckt ist.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

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

C++ Tutorial - Infix-Operatoren überladen

Beitrag von Xeon » Sa Jul 03, 2021 3:23 pm

Hallo zusammen

Habe wieder ein Problem mit den Infix-Operatoren überladen.

Hier der Link:
https://www.proggen.org/doku.php?id=cpp:operator:infix

Hier der Code:

Code: Alles auswählen

class Fraction
{

  private:
    int Numerator;
    int Denominator;
  public:
    Fraction( int num, int den ) : Numerator( num ), Denominator( den ) {}
    explicit Fraction( int num ) : Numerator( num ), Denominator( 1 ) {}

    Fraction operator *( Fraction & rhs );
    Fraction operator *( int rhs );

};

Fraction Fraction::operator *( int rhs )
{
  Fraction result( *this );
  result *= rhs;
  return result;
}

Fraction Fraction::operator *( Fraction & rhs )
{
  return Fraction( *this ) *= rhs;
}

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

  a * b;

  return 0;
}
Hier die Fehlermeldungen:

Code: Alles auswählen

||=== Build: Debug in CplusplusTest (compiler: GNU GCC Compiler) ===|
In member function 'Fraction Fraction::operator*(int)':|
20|error: no match for 'operator*=' (operand types are 'Fraction' and 'int')|
In member function 'Fraction Fraction::operator*(Fraction&)':|
26|error: no match for 'operator*=' (operand types are 'Fraction' and 'Fraction')|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

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

C++ Tutorial - Objektorientierung mit Funktionspointern

Beitrag von Xeon » Do Jul 22, 2021 1:19 pm

Hallo zusammen

Mein Vorschlag wäre da eine Kleinigkeit zu ändern.
Hier erstmal der Link:
https://www.proggen.org/doku.php?id=cpp:oop:funcptr
Hier der Code:

Code: Alles auswählen

class Tier
{
public:
  char Name[64];
  int  Fellfarbe;
  int  KrallenLaenge;
  int  AnzahlBeine;
 
  inline void GibNamenAus( void ) { printf( "Ich heiße %s\n", Name );
 
  void (*GibLaut)( void );
 
  Tier( void (*gibLaut)() ) : GibLaut( gibLaut ) {} 
};
Ich würde bei dieser Zeile

Code: Alles auswählen

Tier( void (*gibLaut)() ) : GibLaut( gibLaut ) {} 
void zwischen den Klammern schreiben, für bessere Lesbarkeit, also so:

Code: Alles auswählen

Tier( void (*gibLaut)(void) ) : GibLaut( gibLaut ) {} 
Da ich schon dran bin, hier fehlt eine geschweifte Klammer am Ende:

Code: Alles auswählen

inline void GibNamenAus( void ) { printf( "Ich heiße %s\n", Name );

Liebe Grüße
Von Xeon

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C++ Tutorial - Objektorientierung mit Funktionspointern

Beitrag von Xin » Do Jul 22, 2021 6:13 pm

Xeon hat geschrieben:
Do Jul 22, 2021 1:19 pm
Hallo zusammen

Mein Vorschlag wäre da eine Kleinigkeit zu ändern.

Ich würde bei dieser Zeile

Code: Alles auswählen

Tier( void (*gibLaut)() ) : GibLaut( gibLaut ) {} 
void zwischen den Klammern schreiben, für bessere Lesbarkeit, also so:

Code: Alles auswählen

Tier( void (*gibLaut)(void) ) : GibLaut( gibLaut ) {} 
Hmm... grundsätzlich gilt eher bei Funktionssignaturen das void in der Parameterliste weg zu lassen...
Gleichzeitig stimme ich Dir allerdings zu, dass das void hier deutlicher darauf hinweist, dass es sich um eine Funktion handelt und die leeren Klammern leichter überlesen werden können.

nufan... Meinung?
Xeon hat geschrieben:
Do Jul 22, 2021 1:19 pm
Da ich schon dran bin, hier fehlt eine geschweifte Klammer am Ende:

Code: Alles auswählen

inline void GibNamenAus( void ) { printf( "Ich heiße %s\n", Name );
Wieso vergess' ich da laufend Klammern?! Danke für's Hingucken! :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

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

Re: C++ Tutorial - Objektorientierung mit Funktionspointern

Beitrag von nufan » Do Jul 22, 2021 9:43 pm

Xin hat geschrieben:
Do Jul 22, 2021 6:13 pm
Hmm... grundsätzlich gilt eher bei Funktionssignaturen das void in der Parameterliste weg zu lassen...
Gleichzeitig stimme ich Dir allerdings zu, dass das void hier deutlicher darauf hinweist, dass es sich um eine Funktion handelt und die leeren Klammern leichter überlesen werden können.

nufan... Meinung?
Der C++ Standard ist hier eindeutig: Leere Klammern bedeuten die Funktion hat keine Parameter. Ich persönlich finde es daher nicht nötig, das durch void nochmals explizit hervorzuheben.

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

C++ Tutorial - Objekt-Typ orientierte Programmierung

Beitrag von Xeon » Do Jul 29, 2021 11:59 am

Hallo zusammen

Hier wieder mal erst der Link:
https://www.proggen.org/doku.php?id=cpp:oop:vtable

Bei diesem Code stimmt höchstwahrscheinlich etwas nicht:

Code: Alles auswählen

enum ObjType
{
  OBJTYPE_CAT,
  OBJTYPE_DOG,
  OBJTYPE_BLACKBIRD  
};
 
struct TierVTable
{
  ObjType Type;
 
  void (*GibLaut)();
  int (*JageFutter)( struct Tier * ); 
  char const * (*FutterArt)();
};
 
class Tier
{
public:
  TierVTable & vtable;
 
  char Name[64];
  int  Fellfarbe;
  int  KrallenLaenge;
  int  AnzahlBeine;
 
  Tier( TierVTable & initVTable ) : vtable( initVTable ) {}
};
 
struct TierVTable TierVTableKatze;
struct TierVTable TierVTableHund;
struct TierVTable TierVTableAmsel; 
 
class Hund : public Tier
{
public:
  int  GefangeneKatzen;
 
  Hund() : Tier( TierVTableHund ) {}
};
 
class Katze : public Tier
{
public:
  int   GefangeneVoegel;
  Katze() : Tier( TierVTableKatze ) {}
};
 
class Amsel : public Tier
{
public:
  int  GefangeneInsekten;
  Amsel() : Tier( TierVTableAmsel ) {}
};
 
static void GibLautKatze() { printf( "Miau\n" ); }
static void GibLautHund() { printf( "Wuff\n" ); }
static void GibLautAmsel() { printf( "Piep\n" ); }
 
static char const * FutterArtKatze() { return "Vögel"; }
static char const * FutterArtHund() { return "Katzen"; }
static char const * FutterArtAmsel() { return "Insekten"; }
 
static int JageFutterKatze( class Tier * thisPtr ) { return ++static_cast< Katze * >( thisPtr )->GefangeneVoegel; }
static int JageFutterHund ( class Tier * thisPtr ) { return ++static_cast< Hund  * >( thisPtr )->GefangeneKatzen; }
static int JageFutterAmsel( class Tier * thisPtr ) { return ++static_cast< Amsel * >( thisPtr )->GefangeneInsekten; }
 
void initVTables()
{
  TierVTableKatze.Type = OBJTYPE_CAT;
  TierVTableKatze.GibLaut = GibLautKatze;
  TierVTableKatze.JageFutter = JageFutterKatze;
  TierVTableKatze.FutterArt = FutterArtKatze;
 
  TierVTableHund.Type = OBJTYPE_CAT;
  TierVTableHund.GibLaut = GibLautHund;
  TierVTableHund.JageFutter = JageFutterHund;
  TierVTableHund.FutterArt = FutterArtHund;
 
  TierVTableAmsel.Type = OBJTYPE_CAT;
  TierVTableAmsel.GibLaut = GibLautAmsel;
  TierVTableAmsel.JageFutter = JageFutterAmsel;
  TierVTableAmsel.FutterArt = FutterArtAmsel;
}
 
void LautUndZweimalJagen( Tier * tier )
{
  tier->vtable.GibLaut();
  printf( "Tier fängt Nahrung: bisher %d %s gefangen\n", tier->vtable.JageFutter( tier ), tier->vtable.FutterArt() );
  printf( "Tier fängt Nahrung: bisher %d %s gefangen\n", tier->vtable.JageFutter( tier ), tier->vtable.FutterArt() );
} 
 
int main( void )
{
  initVTables();
 
  Tier *tier1, *tier2;
 
  tier1 = new Katze();
  tier2 = new Hund();
 
  LautUndZweimalJagen( tier1 );
  LautUndZweimalJagen( tier2 );
  LautUndZweimalJagen( tier1 );
 
  delete tier1;
  delete tier2;
 
  return EXIT_SUCCESS;  
}
Bei der Funktion initVTables() sind zwei Zeilen falsch:

Code: Alles auswählen

TierVTableHund.Type = OBJTYPE_CAT;
TierVTableAmsel.Type = OBJTYPE_CAT;
TierVTableHund.Type und TierVTableAmsel.Type bekommen den Wert von OBJTYPE_CAT zugewiesen, obwohl OBJTYPE_CAT kein Hund und keine Amsel ist. So müsste es richtig sein:

Code: Alles auswählen

TierVTableHund.Type = OBJTYPE_DOG;
TierVTableAmsel.Type = OBJTYPE_BLACKBIRD;
Richtig?


Liebe Grüße
Von Xeon

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C++ Tutorial

Beitrag von Xin » Do Jul 29, 2021 4:43 pm

Hsmpf, leider vollkommen richtig…

Magst Du es ändern? Ich hab momentan keinen Rechner mit Internet zur Verfügung.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

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

Re: C++ Tutorial

Beitrag von nufan » Do Jul 29, 2021 9:17 pm

Ist ausgebessert :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C++ Tutorial

Beitrag von Xin » Fr Jul 30, 2021 6:56 am

Danke! 🙏
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten