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.
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.
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
void zwischen den Klammern schreiben, für bessere Lesbarkeit, also so:
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
void zwischen den Klammern schreiben, für bessere Lesbarkeit, also so:
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!