Seite 5 von 7

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

Verfasst: Mi Jun 30, 2021 12:07 pm
von Xeon
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

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

Verfasst: Sa Jul 03, 2021 9:15 am
von Xin
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.

C++ Tutorial - Infix-Operatoren überladen

Verfasst: Sa Jul 03, 2021 3:23 pm
von Xeon
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)) ===|

C++ Tutorial - Objektorientierung mit Funktionspointern

Verfasst: Do Jul 22, 2021 1:19 pm
von Xeon
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

Re: C++ Tutorial - Objektorientierung mit Funktionspointern

Verfasst: Do Jul 22, 2021 6:13 pm
von Xin
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! :-)

Re: C++ Tutorial - Objektorientierung mit Funktionspointern

Verfasst: Do Jul 22, 2021 9:43 pm
von nufan
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.

C++ Tutorial - Objekt-Typ orientierte Programmierung

Verfasst: Do Jul 29, 2021 11:59 am
von Xeon
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

Re: C++ Tutorial

Verfasst: Do Jul 29, 2021 4:43 pm
von Xin
Hsmpf, leider vollkommen richtig…

Magst Du es ändern? Ich hab momentan keinen Rechner mit Internet zur Verfügung.

Re: C++ Tutorial

Verfasst: Do Jul 29, 2021 9:17 pm
von nufan
Ist ausgebessert :)

Re: C++ Tutorial

Verfasst: Fr Jul 30, 2021 6:56 am
von Xin
Danke! 🙏